5

サーバー上の 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 フィルターが機能していると想定しても安全です。これを裏付けるために、フィドラー トレースを行ったところ、すべて問題ないように見えました。 上記のセットアップでの Fiddler トレース

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」のアラート ボックスが表示されます。フィドラー トレースを取得すると、次のようになります。

プリフライト リクエストによる Fiddler トレース。

カスタム ヘッダーをリクエストに追加しているので、ブラウザがプリフライト リクエストを送信するのは理にかなっています。しかし、CORS フィルター構成に認証ヘッダーを追加しているにもかかわらず、Tomcat が 401 コードで応答する理由がわかりません。

助けや反応をいただければ幸いです


編集:もう 1 つ気づいたこと - 私の URL が単に "bavarians:8080/solr/" の場合、Tomcat はプリフライトされたリクエストを正常に承認し、すぐ次のリクエストは通常​​の GET リクエストとして 200 OK レスポンスで処理されます。しかし、関数名を入力して URL でクエリを実行すると、再び 401 が返されます。ブラウザから上記の URL にアクセスするには、Basic 認証が必要です。ある時点CORSFilterまでは機能します

4

3 に答える 3