サーバー上の IIS から単純な GWT アプリケーションを実行しています。同じサーバーで実行されている tomcat への HTTP リクエストをテストしようとしています。ただし、両方のアプリケーション サーバーが異なるポートで実行されているため、私のブラウザー (chrome と firefox) は要求を CORS 要求として扱います。
Tomcat が CORS リクエストを受け入れられるようにするために、Tomcat 7.0.52 に更新し、グローバルな web.xml 構成で CORS フィルターを有効にしました。この簡単なセットアップをテストしましたが、うまくいくようです。GWT のコードは次のとおりです。
String url = "http://bavarians:8080/";
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url);
box.setText(url);
try
{
rb.sendRequest("", new RequestCallback(){
@Override
public void onResponseReceived(Request request, Response response)
{
Window.alert(response.getStatusCode() + response.getStatusText());
}
@Override
public void onError(Request request, Throwable exception)
{
Window.alert("Request failed");
}});
}
catch (RequestException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
これに関連付けられている CORS フィルターは次のとおりです。
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>http://bavarians</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials, Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
このセットアップでは、Tomcat から 200 OK 応答を受け取ります。したがって、CORS フィルターが機能していると想定しても安全です。これを裏付けるために、フィドラー トレースを行ったところ、すべて問題ないように見えました。
tomcat(solr)のアプリにアクセスしたいので、CORSリクエストでベーシック認証が必要です。これにより、プリフライト リクエストが明確になります。資格情報の使用を有効にするように CORS フィルターをセットアップしたので、変更する必要はありませんでした。だから、私は自分のコードに次の変更を加えました
String url = "http://bavarians:8080/solr/select?wt=xml&q=tag_name:abcd&username=domain\\userid";
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url);
box.setText(url);
rb.setHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
rb.setIncludeCredentials(true);
ここで、このコードを使用しようとすると、onResponseReceived
コード ブロック内に入り、値が「0」のアラート ボックスが表示されます。フィドラー トレースを取得すると、次のようになります。
カスタム ヘッダーをリクエストに追加しているので、ブラウザがプリフライト リクエストを送信するのは理にかなっています。しかし、CORS フィルター構成に認証ヘッダーを追加しているにもかかわらず、Tomcat が 401 コードで応答する理由がわかりません。
助けや反応をいただければ幸いです
編集:もう 1 つ気づいたこと - 私の URL が単に "bavarians:8080/solr/" の場合、Tomcat はプリフライトされたリクエストを正常に承認し、すぐ次のリクエストは通常の GET リクエストとして 200 OK レスポンスで処理されます。しかし、関数名を入力して URL でクエリを実行すると、再び 401 が返されます。ブラウザから上記の URL にアクセスするには、Basic 認証が必要です。ある時点CORSFilter
までは機能します