proxy-config.xml ファイルは、URI 要求がプロキシーを通過することをサポート するポリシーを定義し、クライアントからのコンテキスト・パスがサーバー上の URI にどのようにマップされるのかを定義します。
proxy-config.xml ファイルは、テキスト・エディターで変更できます。このファイルは、プロキシー・サーブレットが参照可能なクラスパスに保存してください。proxy-config.xml ファイルの変更は、 動的には行われません。変更内容を有効にするには、サーブレットを再始動します。
JavaTM Platform, Enterprise Edition (Java EE) のエンタープライズ・アーカイブ (EAR) ファイルに Ajax ベースのアプリケーションが含まれているとします。別のサーバーから発信されるコンテンツを結合して喫茶店のロケーション情報を 提供するには、Dojo Toolkit を使用します。データ・フォーマットは、別のサーバーから JavaScriptTM Object Notation (JSON) データ として返されます。開発中の Ajax ベースのアプリケーションを使用して、返された JSON データを結合します。 これを一般に、クライアント・サイドのマッシュアップといいます。
以下のコードを入力します。
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>
上記のコンテキスト・パスは、アクセスされるサービスのコンテキスト・ルートです。URL は サービスのルート URL です。例えば、http://www.myinformation.com/location/coffee にアクセスすれば、ブラウザーで直接このサービスを利用できます。
コード内でプロキシーにアクセスするパスは、Ajax プロキシーのデプロイ方法によって 異なります。Ajax プロキシーに使用できる、web.xml の 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/ ディレクトリー に入っています。2 つのスキーマは、proxy-config_1.0.1.xsd と proxy-config_1.0.xsd です。proxy-config_1.0.1.xsd は、1.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 のフローを制御するには、許可される Cookie 名を proxy-config.xml ファイル内に定義します。 次の例は、キー名が 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 を使用するセキュア・ソケット接続を必要とするサービスはたくさんあります。Ajax プロキシーは、 Web アプリケーションとして、JavaTM Secure Socket Extension (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 に 設定されています。ご使用のアプリケーションが 3 つ以上のリモート・サイトにアクセスしてコンテンツを取得する場合は、 この値を増やしてください。
<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」 になります。
forward-http-errors メタ・パラメーターを proxy-config.xml 内に設定すると、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 要求を受け取ると、プロキシーはその要求を「403: Forbidden」HTTP コードにマップします。
注: 現在のところ、基本認証メカニズムは、プロキシーによってサポートされる唯一の HTTP 認証方式です。
Ajax プロキシーの IP フィルタリングにより、Ajax プロキシーが接続する先のサービスを保護するために IP アドレスをホワイトリストまたは ブラックリストに登録することができます。ブラックリストにはクライアントが接続を許可されないサービス 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: The specified target hosts IP-address is prohibited by rule.
しかし、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 プロキシーは定義されている順序でルールを処理します。これは、前にどのような allow および deny のルールがあるかに関わらず、 最後に合致するルールが常に効力を持つことを意味します。