web-dev-qa-db-ja.com

クロスオリジンリクエストは、HTTPステータスコード403のTomcat8でブロックされます

既知の問題のように思われるかもしれませんし、このトピックには多くの質問がありますが、私の状況は非常に奇妙です。 Tomcat8.0.36にデプロイされている単純なWebアプリケーションがあります。 CORSを適切に設定しました:

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.Apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

クロスオリジンリクエストはブラウザによってブロックされます:

要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' https://www.mytestpage.com 'はアクセスを許可されていません。応答のHTTPステータスコードは403でした。

Tomcatログファイルには、403の応答コードも表示されます。興味深いのは、クロスオリジンリクエストの場合にアプリケーションのコードが実行されないことです。リクエストはアプリケーションに到達する前にブロックされ、403がすぐに送信されます。 Tomcatの前にApacheはありません。プレーンなTomcatです。オリジンのホワイトリストへの登録や許可されたヘッダーの指定など、さまざまなことを試しましたが、何の役にも立ちませんでした。また、クロスオリジンリクエストの場合のコードが実行されないことがわかるまで、プログラムでヘッダーを設定しようとしました。

UPD:エンドポイントはPOSTリクエストを受け入れます。これらのPOSTリクエストは、JSスニペットからXmlHttpRequestsとして送信されます。

それが何であるかについて何か考えはありますか?

p.s同じOriginリクエストを成功させることができます。

7
bekon

問題が何であるかを見つけました。リクエストにContent-Typeヘッダーを設定する必要がありました。そうしないと、リクエストがブロックされてしまいます。 - Tomcat CORSフィルター

4
bekon

実際には、Access-Control-Allow-OriginAccess-Control-Allow-Methodsの両方を設定する必要があります。次に例を示します。

Access-Control-Allow-Origin: http://www.myhost.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE

また、両方のAccess-Control-Allow-*ヘッダー行を返す「OPTIONS」メソッドを受け入れる必要があります。一部のブラウザは、サービスのアクセス情報を取得するために、実際のリクエスト(「PUT」リクエストなど)の前にこの種のリクエストを発行する場合があります。

1
Boris Brodski

私はちょうど同じような状況に陥りました。必要なすべてのWebアプリに同じTomcatサーバーを使用して解決しました。また、localhostの代わりにTomcatサーバーの詳細な名前を使用する必要がありました。 CORSフィルターの問題はもう見られませんでした。

0