proxy-config.xml 文件用于定义策略(从而按照此策略来支持 URI 请求通过代理传递)以及将客户机中的上下文路径映射到服务器上的 URI 的方式。
您可以使用文本编辑器来修改 proxy-config.xml 文件。请将此文件保存到类路径中可以被代理 Servlet 找到的位置。对 proxy-config.xml 文件所作的更改不会立即生效;请重新启动 Servlet 以使这些更改生效。
假定 JavaTM Platform, Enterprise Edition (Java EE) 企业归档 (EAR) 文件包含基于 Ajax 的应用程序。您正在使用 Dojo Toolkit 来组合来自另一服务器的内容并提供咖啡店的地点信息。数据格式以 JavaScriptTM 对象表示法 (JSON) 数据形式从另一服务器返回。然后,将返回的 JSON 数据与您正在开发的基于 Ajax 的应用程序相结合(这通常称为客户机端混合)。
输入下列代码行:
GET http://www.myinformation.com/location/coffee HTTP/1.1将返回以下 JSON 内容:
{ "locations":{ "location":[ { "id":"Jumpin Joes Example", "city":"Anywhere", "location":"Weston Pkwy", "address":"126 Weston Pkwy, Anywhere, NC 27513", "date":"May 2nd, 2008" }, { "id":"Coffee & Crepes Example", "city":"Anywhere", "location":"Crossroads Blvd", "address":"123 Crossroads Blvd, Anywhere, NC 27518", "date":"May 3rd, 2008" } ] } }
在使用 Ajax 代理的情况下,可以通过在 proxy-config.xml 文件中添加下列代码行来提供此服务:
<?xml version="1.0" encoding="UTF-8"?> <proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/websphere/featurepack/v6.1/proxy-config" xsi:noNamespaceSchemaLocation="C:\temp\proxy-config.xsd"> <proxy:mapping contextpath="/location/coffee" url="http://www.myinformation.com"/> <proxy:policy url="*" acf="none"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
以上的 contextpath 是正在访问的服务的上下文根。URL 是服务的根 URL。例如,可以通过使用 http://www.myinformation.com/location/coffee 直接在浏览器中访问该服务。
代码中用于访问代理的路径取决于 Ajax 代理的部署方式。请考虑 web.xml 中可用于 Ajax 代理的 XML 片段:
<servlet-mapping> <servlet-name>ProxyServlet</servlet-name> <url-pattern>/proxymashup/*</url-pattern> </servlet-mapping>
var deferred = dojo.xhrGet( { url: "/proxy/proxymashup/location/coffee", timeout: 5000, handleAs : "text/json", headers: { "Content-Type":"text/html" }, } );
proxy-config.xml 文件的 XML 模式在 AjaxProxy.war 文件的 WEB-INF/ 目录中。两种模式分别是 proxy-config_1.0.1.xsd 和 proxy-config_1.0.xsd。proxy-config_1.0.1.xsd 与 V1.0.1 相对应,并包含 IP 过滤等新功能。用户可以继续使用与 proxy-config_1.0.xsd 相对应的先前版本 proxy-config.xml。
<proxy:policy url="*" acf="none"> . . <proxy:mime-types> <proxy:mime-type>text/json</proxy:mime-type> </proxy:mime-types> . . </proxy:policy>
如果服务返回 text/html,那么代理将通过向客户机返回错误情况进行响应,这是因为,未将 text/html 列示为可从服务器接受的内容类型。如果未指定 <proxy:mime-types>,那么行为是允许所有内容类型。
要控制 Cookie 流,请在 proxy-config.xml 文件中定义所允许的 Cookie 名称。以下示例说明如何配置代理,以便只传递 Cookie 键名为 Session-Cookie-0 的 Cookie。
<proxy:policy url="*" acf="none"> . . <proxy:cookies> <proxy:cookie>Session-Cookie-0</proxy:cookie> </proxy:cookies> . . </proxy:policy>
<proxy:policy url="*" acf="none"> . . <proxy:headers> <proxy:header>User-Agent</proxy:header> <proxy:header>Accept*</proxy:header> <proxy:header>Content*</proxy:header> <proxy:header>Authorization*</proxy:header> <proxy:header>My-New-Header</proxy:header> <proxy:header>My-Other-New-Header</proxy:header> </proxy:headers> . . </proxy:policy>
多个服务可能需要一个使用 SSL 的安全套接字连接。作为 Web 应用程序,Ajax 代理利用了 JavaTM 安全套接字扩展 (JSSE) 并完全受产品支持。请查阅有关 SSL 证书支持的相应 WebSphere® 文档。
<proxy-meta-data> <proxy:name>unsigned_ssl_certificate_support</proxy:name> <proxy:value>true</proxy:value> </proxy-meta-data>
如果 unsigned_ssl_certificate_support 处于启用状态,那么 Ajax 代理将接受任何 SSL 证书。在实践中,此设置用于开发,而不应该用于生产环境。
可以使用多个参数对 Ajax 代理进行调整。
maxconnectionperhost 是一个全局值,它指定要为任何主机或端口组合保持活动的连接的最大数目。缺省情况下,此值设置为 2。如果应用程序访问两个以上远程站点以获取内容,请增大此值。
<proxy:meta-data> <proxy:name>maxconnectionsperhost</proxy:name> <proxy:value>2</proxy:value> </proxy:meta-data>
maxtotalconnections 是代理所支持的最大连接总数。缺省值是 5。您选择的值必须足够大,以便支持您可能接收到的并发连接数。在实践中,请考虑 Web 容器的配置方式以及容器所支持的并发连接数。
<proxy:meta-data> <proxy:name>maxtotalconnections</proxy:name> <proxy:value>5</proxy:value> </proxy:meta-data>
socket-timeout 定义缺省的套接字超时(以毫秒计),即建立连接后等待数据的时间。缺省值是超时值 0,此值被解释为无限超时。
<proxy:meta-data> <proxy:name>socket-timeout</proxy:name> <proxy:value>5000</proxy:value> </proxy:meta-data>
retries 定义 Ajax 代理在放弃建立连接前应该执行的套接字重试的次数。缺省值是 2。
<proxy:meta-data> <proxy:name>retries</proxy:name> <proxy:value>3</proxy:value> </proxy:meta-data>
connection-timeout 定义建立连接前的时间(以毫秒计)。如果未指定任何值,那么将使用缺省值 60000。如果使用 0,那么此值将被解释为不使用超时功能。
<proxy:meta-data> <proxy:name>connection-timeout</proxy:name> <proxy:value>3000</proxy:value> </proxy:meta-data>
connection-pool-time 定义尝试建立连接前的时间(以毫秒计)。对于超出 maxtotalconnections 后的所有后续请求,情况正是如此。如果使用 0,那么此值将被解释为不使用超时功能。 0 也是缺省值。
<proxy:meta-data> <proxy:name>connection-pool-timeout</proxy:name> <proxy:value>1000</proxy:value> </proxy:meta-data>
缺省情况下,Ajax 代理将只转发大于或等于 200 并小于 400 的 HTTP 状态码。此范围外的状态码将自动更改为“404 File Not Found”错误。唯一的例外是代码 401(未经授权),除非对该特定请求启用了 basic-auth-support 属性,否则此代码将生成“403 Forbidden”。
通过在 proxy-config.xml 中设置 forward-http-errors 元参数,可以将大于或等于 400 的 HTTP 代码随消息一起转发。
<proxy:meta-data> <proxy:name>forward-http-errors</proxy:name> <proxy:value>true</proxy:value> </proxy:meta-data>
可以对 Ajax 代理进行配置,以便在访问网络前连接到另一个代理。如果 Ajax 代理在访问网络前需要通过更宽的防火墙,那么可能需要连接到传递代理。Ajax 代理支持基本认证。
以下示例显示了一个虚构的代理防火墙的配置。passthru_host 是必需参数。 其他参数(如 passthru_type、passthru_username 和 passthru_password)是可选参数。passthru_type 参数表示所使用的认证的类型。缺省类型是 BASIC。或者也可以使用 DIGEST 和 NTLM。 NTLM 需要附加参数 passthru_hostname 和 passthru_domain。passthru_port 和 passthru_realm 参数也是可选参数。如果未指定 passthru_port 参数,那么将使用缺省端口 80。如果未指定 passthru_realm 参数,那么将为所有认证尝试发送凭证。在生产环境中,请指定 passthru_realm 参数,以免为所有认证请求都提供用户名和密码信息。
<proxy-meta-data> <proxy:name>passthru_type</proxy:name> <proxy:value>BASIC</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_host</proxy:name> <proxy:value>9.17.237.132</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_port</proxy:name> <proxy:value>3128</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_realm</proxy:name> <proxy:value>MyRealm</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_username</proxy:name> <proxy:value>username</proxy:value> </proxy-meta-data> <proxy-meta-data> <proxy:name>passthru_password</proxy:name> <proxy:value>password</proxy:value> </proxy-meta-data>
您可以通过在 proxy-config.xml 中为策略设置 basic-auth-support 属性来启用基本认证。例如:
<proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1"> <proxy:mapping contextpath="/proxy/*" /> <proxy:policy url="*" acf="none" basic-auth-support="true"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
在此示例中,Ajax 代理会将 HTTP 状态和头信息转发回给目标服务和客户机。如果未设置 basic-auth-support,并且 Ajax 代理接收到 401 请求,那么此代理会将该请求映射到 HTTP 代码“403 : Forbidden”。
注意:目前,基本认证机制是唯一受此代理支持的 HTTP 认证方法。
Ajax 代理的 IP 过滤功能允许您以白名单或黑名单方式列示 IP 地址,以便保护 Ajax 代理可能要连接的服务。黑名单包含不允许客户机连接的服务 IP 地址,而白名单包含 Ajax 代理能够连接到的服务的 IP 地址。
proxy:ipfilter 定义要过滤的 IP 地址。proxy:allow 定义 IP 地址或地址范围的白名单。proxy:deny 定义 IP 地址或地址范围的黑名单。
例如:<proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1"> <proxy:mapping contextpath="/proxy/*" > <proxy:ipfilter> <proxy:deny>9.6.0.0/255.255.0.0</proxy:deny> <proxy:allow>9.6.1.0/255.255.255.0</proxy:allow> <proxy:deny>9.6.1.4</proxy:deny> </proxy:ipfilter> </proxy:mapping> <proxy:policy url="*" acf="none"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
CWXJX1000E: 指定的目标主机 IP 地址被规则所禁止。
但是,Ajax 代理将访问 9.6.1.5 或 9.6.1.120,但将拒绝访问 9.6.1.4。
另一个示例是,先以黑名单方式列示所有 IP 地址,然后添加附加的 IP 范围。在此示例中,以下代码元素将阻塞所有 IP 地址:*.*.*.*。但是,支持 98.137.80.1 到 98.137.254 范围内的 IP 地址。
<proxy-rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1"> <proxy:mapping contextpath="/rss/economy" url="http://rss.news.yahoo.com"> <proxy:ipfilter> <proxy:deny>*.*.*.*</proxy:deny> <proxy:allow>98.137.80.0/255.255.255.0</proxy:allow> </proxy:ipfilter> </proxy:mapping> <proxy:policy url="*" acf="none"> <proxy:actions> <proxy:method>GET</proxy:method> </proxy:actions> </proxy:policy> </proxy-rules>
添加新的过滤规则时,可以按多种方式对其进行组合,但 Ajax 代理始终按它们的定义顺序对其进行处理。这意味着,最后一个匹配规则将始终生效,而与该规则前面的任何允许规则和拒绝规则无关。