步骤 2 :分发应用组件
7 代理对另一个 代理对另一个 代理对另一个 代理对另一个 HTTP 服务器的请求 服务器的请求 服务器的请求 服务器的请求
概述 概述 概述 概述
如果把WebLogic服务器作为主Web服务器,通过配置,可以让它把请求委托 给另一个HTTP服务器处理,例如Netscape Enterprise服务器,Apache 或者是 Microsoft Internet Information 服务器。任何被代理的请求 都会重定向到一个指定的URL。被代理的Web服务器可以位于其它机器上。我 们一般基于请求的URL来决定把请求委托给哪个服务器处理。
HttpProxyServlet将HTTP请求重定向到代理URL上,然后通过WebLogic 服务器将响应返回给浏览器。要使用代理功能,必须在Web应用中配置该功能,
并把它分发到一个重定向请求的WebLogic服务器中。
设置从服务器的代理 设置从服务器的代理 设置从服务器的代理 设置从服务器的代理
要设置从服务器的代理:
1.在Web应用分发描述符(见“使用ProxyServet的web.xml示例”)注册代理servlet。
Web 应 用 必 须 是 响 应 请 求 的 服 务 器 的 缺 省 应 用 。 代 理 servlet 的 类 名 为 weblogic.t3.srvr.HttpProxyServlet。详细信息可以参见以下资源中的“分发与配置Web 应 用”
http://e-docs.bea.com/wls/docs60/adminguide/config_web_app.html
2. 定义 ProxyServlet 的初始化参数。<param-name>为 redirectURL, <param-value>
为从服务器的URL。
3. 在Web应用分发描述符web.xml中使用<servlet-mapping>元素把ProxyServlet映射 到<url-pattern>。特别地,把文件扩展名映射到ProxyServlet,例如*.jsp,或*.html。
如果<url-pattern>设置为“/”,那么任何不能被WebLogic服务器所解析的请求都会 委托给远程服务器处理。如果你只希望代理特定扩展名的文件,那么应该映射以下扩展:
- 83 -
*.jsp, .html以及*.htm。
代理 代理 代理
代理 Servlet 的分发描述符示例 的分发描述符示例 的分发描述符示例 的分发描述符示例
以下是使用Proxy servlet的Web应用分发描述符示例。
表 表表
表8-4 使用使用使用使用ProxyServlet的的的的web.xml示例示例示例示例
<!-- DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.
//DTD Web Application 1.2//EN"
"file:///weblogic/dev/myserver/servlet2.2/WEB-INF/web-jar.dtd"
-->
<web-app>
<servlet>
<servlet-name>ProxyServlet</servlet-name>
<servlet-class>weblogic.t3.srvr.ProxyServlet</servlet-class>
<init-param>
<param-name>redirectURL</param-name>
<param-value>
tehama1:7736:7737|tehama2:7736:7737|tehama:7736:7737
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ProxyServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ProxyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ProxyServlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
- 84 -
<servlet-mapping>
<servlet-name>ProxyServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
- 85 -
8 代理对 代理对 代理对 代理对 WebLogic 集群的请求 集群的请求 集群的请求 集群的请求
本章将介绍如何代理对WebLogic集群的请求,主要有以下内容:
概述
设置HttpClusterServlet
HttpClusterServlet示例
概述 概述 概述 概述
HttpClusterServlet 负 责 把 请 求 从 一 个 WebLogic 服 务 器 代 理 到 WebLogic 集群中的服务器成员,同时 HttpClusterServlet 还为代理的 HTTP请求提供负载平衡与失败转移。有关servlets与WEbLogic集群的更 多内容,可以参见以下页面的“理解HTTP会话状态复制”部分:
http://e-docs.bea.com/wls/docs60/cluster/servlet.html.
设置 设置 设置
设置 HttpClusterServlet
以下是使用HttpClusterServlet所需要的配置:
1.在WebLogic服务器的管理控制台配置一个代理HTTP请求的WebLogic服务器实例,
该服务器实例负责把请求重定向到WebLogic服务器。
a. 新建一个域。
b. 在新建的域中新建一个应用
c. 在新建的域中新建一个服务器,或使用缺省的服务器
d. 把在步骤b中创建的Web应用设置为新建服务器的缺省Web应用。
2.在步骤 1 所创建的 Web 应用的分发描述符中注册 HttpClusterServlet。(见本章的
“HttpServlet 的分发描述符示例”)。该Web 应用必须是响应请求的服务器的缺省Web 应用。相关信息参见第8章的“指定一个缺省Web应用”。
HttpClusterServlet 的 类 名 是
weblogic.servlet.internal.HttpClusterServlet。HttpClusterServlet 的 分发描述符示例见下文
- 86 - 3. 定义HttpClusterServlet的初始化参数。初始化参数用web.xml的<init-param>元素定 义。defaultServers参数是必须定义的,其它参数视需要而定。有关HttpClusterServlet的 参数可以参见本章表10-1 “HttpClusterServlet Parameters”中的内容。
4.把代理servlet映射到一个<url-pattern>。特别地,映射要代理的文件扩展名,例如“*.jsp” 或*.html。
如果<url-pattern>设置为“/”,那么任何不能被WebLogic服务器所解析的请求都将 交给远程服务器处理。如果你只希望代理特定扩展名的文件,那么应该映射以下扩展名文件:
<param-name> <param-value> 缺省值
defaultServlets (必须设置该参数)一组代理请求的服务器,采用以下
形式:hostname1:HTTP port1:HTTPS port1 | hostname2:HTTP port2:HTTPS port2
如果 secureProxy 参数设置为 ON(见下面的 secureProxy 参数),那么 HTTPS 端口将在运行 HttpClusterServlet 的 WebLogic 服务器与集群的成员服务器之间使用 SSL 协 议。即使把 secureProxy 参数设为 OFF,你也必须定义 HTTPS 端口
None
secureProxy ON/OFF。如果设置为 ON,那么 HTTPClusterServlet 与 WebLogic 服务器集群成员之间的连接将使用 SSL 协议
OFF
DebugConfigInfo ON/OFF。如果设置为 on,那么在请求中加上一个请求
参数?_WebLogicBridgeConfig 就可以查询 HttoClusterServlet 的调试信息。因为安全性的原因,建议在生产环境中把 该参数设置为 OFF。
OFF
connectionTimeout 套接字等待读入数据的时间,单位为微秒。超时会引发 java.io.InterruptedIOException 异常
0(即没有限 制)
numOfRetries HttpClusterServlet 重试一个失败连接的次数 5
PathTrim 从原始 URL 的开头部分裁减的字符串 None
TrimExt 从原始 URL 的最后裁减掉的文件扩展名 None
pathPrepend 在 PathTrim 被裁减后,在请求被代理到一个 WebLogic
服务器集群成员之前,附加在原始 URL 之前的字符串。
None
HttpClusterServlet 的分发描述符示例 的分发描述符示例 的分发描述符示例 的分发描述符示例
以下是使用HttpClusterServlet的Web应用分发描述符示例:
- 87 - 列表
列表 列表
列表10-1 使用使用使用使用HttpClusterServlet的的的的web.xml示例示例示例示例
<!-- DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.
//DTD Web Application 1.2//EN"
"file:///weblogic/dev/myserver/servlet2.2/WEB-INF/web-jar.dtd"
- 88 -
<servlet-mapping>
<servlet-name>HttpClusterServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
- 89 -
9
配置 配置 配置
配置 Web 应用的安全性 应用的安全性 应用的安全性 应用的安全性
通过验证,限制对Web应用中某些资源的访问或者在servlet中使用安全调用,你可以 保护你的应用。WebLogic定义了几种安全域,有关安全域的讨论见以下资源的“安全基 础知识”:
http://e-docs.bea.com/wls/docs60/security/concepts.html
注意,安全域为多个虚拟主机所共享。
设置对 设置对 设置对
设置对 Web 应用的授权 应用的授权 应用的授权 应用的授权
Web应用的验证在web.xml的<longin-config>元素中定义。用该元素定义安全域。
安全域包含用户证书、验证方式与需要进行验证的资源所在的位置。有关设置安全域的更 多内容,请参见以下资源中的“安全基础”部分。
要设置Web应用的安全验证:
1.选择一种验证方式。有以下几种选项 BASIC
BASIC 验证通过 Web 浏览器显示一个用户名/口令对话框。然后依照安全域对用户名及口 令进行验证。
FORM
基于表单的验证需要一个包含用户名与口令的 HTML 表单。该表单所返回的字段必须是 j_username与j_password,表单的action属性必须设为j_security_check,以 下是一个用FORM授权的HTML示例:
<form method=”POST” action=”j_security_check”>
<input type=”text” name=”j_username”>
<input type=”password” name=”j_password”>
</form>
产 生 该 表 单 的 资 源 可 能 是 HTML 页 面 、JSP 或 者 是 servlet。 你 必 须 用
<form-login-page>元素定义产生该表单的资源。
- 90 - 会 话 对 象 在 返 回 登 录 页 面 时 创 建 。 因 此 在 验 证 通 过 后 , 从 被 服 务 的 页 面 中 调 用 session.isNew()方法,该方法将返回FALSE。
CLIENT-CERT
使用客户端验证对请求进行验证。详细内容,参见以下资源的“配置SSL协议”部分:
http://e-docs.bea.com/wls/docs60/adminguide/cnfgsec.html#cnfgsec015
2.如果选用FORM 验证,那么还需要定义生成HTML页面的资源所在的位置与响应验证
失败的资源。有关配置表单验证的详细信息,请参见以下网页中的“<login-config>”的内 容:
http://e-docs.bea.com/wls/docs60/programming/web_xml.html#login –config.
3.定义用来验证的域。如果没有指定域,将使用缺省的WebLogic FileRealm域。详细内
容,参见以下网页发“<login-config>”部分:
http://e-docs.bea.com/wls/docs60/programming/web_xml.html#login-config 多
多 多
多 Web 应用 应用、 应用 应用 、 、 、Cookies 与身份验证 与身份验证 与身份验证 与身份验证
缺省情况下,所有Web应用都使用一样的cookie名字(JSESSIONID)。无 论你用何种验证方式,所有使用相同cookie名的应用对授权都采用单点签到 的方式。即一旦一个用户验证通过后,那么该验证对于其它使用同样 cookie 名字的Web应用的请求也是有效的,用户不会被要求重新验证。
如果要对一个应用单独授权,那么应该为这个应用指定一个不同的cookie名 字 。 该 名 字 由 weblogic.xml 的<session-descriptor>元 素 中 的 CookieName 参数定义。详细内容,参见以下网页“session-descriptor 元素”中的内容:
http://e-docs.bea.com/wls/docs60/programming/weblogic_xml.html#session-descr iptor.
限制对 限制对
限制对 限制对 Web 应用资源的访问 应用资源的访问 应用资源的访问 应用资源的访问
你可以对Web应用中的资源(servlets, JSPs, 或者HTML页面)应用安全 约束。要使用安全约束,你应该:
1、定义一个角色,该角色对应于安全域里的一到多个准则(principal)。角色在 web.xml
中 的 <security-role> 元 素 中 定 义 ( 见 http://e-docs.bea.com/wls/docs60/programming/
web_xml.html#security-role)。然后在weblolgic.xml中,用<security-role-assignment>元 素 把 这 些 角 色 映 射 到 域 中 的 准 则 ( 见 http://e-docs.bea.com/wls/docs60
- 91 - /programming/weblogic_xml.html#security-role-assignment)。
2.用<web-resource-collection>元素的<url-pattern>子元素定义Web应用中需要实施安全 限制的资源。<url-pattern>可以是一个目录、文件名或者是一个<servlet-mapping>
要对整个应用实施安全限制,那么应该用以下<url-pattern>:
<url-pattern>/*</url-pattern>
3、使用<web-resource-collection>元素中的<http-method>子元素定义需要应用安全限制的 HTTP方法(Get或Post)
4、使用<user-data-constraint>元素中的<transport-guarantee>子元素设置客户端与服务器 端的通信是否使用SSL。
列表 列表列表
列表8-6 资源限制示例资源限制示例资源限制示例资源限制示例
web.xml entries:
<security-constraint>
<web-resource-collection>
<web-resource-name>SecureOrdersEast</web-resource-name>
<description>
Security constraint for resources in the orders/east directory
</description>
<url-pattern>/orders/east/*</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>constraint for east coast sales</description>
<role-name>east</role-name>
<role-name>manager</role-name>
</auth-constraint>
<user-data-constraint>
<description>SSL not required</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
- 92 -
</security-constraint>
...
<security-role>
<description>east coast sales</description>
<role-name>east</role-name>
</security-role>
<security-role>
<description>managers</description>
<role-name>manager</role-name>
</security-role>
weblogic.xml中的条目:
<security-role-assignment>
<role-name>east</role-name>
<principal-name>tom</principal-name>
<principal-name>jane</principal-name>
<principal-name>javier</principal-name>
<principal-name>maria</principal-name>
</security-role-assignment>
<security-role-assignment>
<role-name> manager </role-name>
<principal-name>peter</principal-name>
<principal-name>georgia</principal-name>
</security-role-assignment>
在 在 在
在 servlet 中使用用户和角色 中使用用户和角色 中使用用户和角色 中使用用户和角色
你 可 以 在 servlet 中 用
javax.servlet.http.HttpServletRequest.isUserInRole
(String role)方法访问用户与角色。字符串role对应于Web应用分发描 述符的<security-role-ref>元素的<role-name>子元素所定义的名字,
<secutity-role-ref>元素位于<servlet>声明中。<role-link>元素映
- 93 - 射到 Web 应用分发描述符的<security-role>元素所定义的<role-name>
元素。
例如 列表列表列表
列表 8-7 安全角色映射示例安全角色映射示例安全角色映射示例安全角色映射示例
Servlet代码:
isUserInRole("manager");
web.xml 中的条目:
<servlet>
. . .
<role-name>manager</role-name>
<role-link>mgr</role-link>
...
</servlet>
<security-role>
<role-name>mgb</role-name>
</security-role>
weblogic.xml中的条目:
<security-role-assignment>
<role-name>mgr</role-name>
<principal-name>al</principal-name>
<principal-name>george</principal-name>
<principal-name>ralph</principal-name>
</security-role-ref>
配置 配置 配置
配置 Web 应用的外部资源 应用的外部资源 应用的外部资源 应用的外部资源
在访问外部资源时,例如通过JNDI从Web应用访问数据源,你可以让代码中 使用的 JNDI 名字映射到绑定在 JNDI 树中的实际名字。这种映射是通过
- 94 - web.xml以及Weblogic.xml分发描述符来实现的。这样当这些资源发生变 化时,就不需要更新应用程序的代码。你应该为这些资源提供一个由代码使用 的名字,即资源在 JNDI树中所绑定的名字,以及资源的Java 类型;并且还
- 94 - web.xml以及Weblogic.xml分发描述符来实现的。这样当这些资源发生变 化时,就不需要更新应用程序的代码。你应该为这些资源提供一个由代码使用 的名字,即资源在 JNDI树中所绑定的名字,以及资源的Java 类型;并且还