非常に単純な CORS フィルターを持つ Spring Boot REST アプリケーションがあります。私がやりたいことは、特定のリストを提供するのではなく、Access-Control-Request-Headers ヘッダーの値に動的に応答することです。一般的な知恵は、「Access-Control-Allow-Headers」で返される値を明示的に設定することのようですが、オリジンのセットをホワイトリストに登録し、オリジンが送信するすべてのヘッダーを許可したいと考えています。Access-Control-Request-Headers の Access-Control-Allow-Headers の値をオウム返しする方法が見つかりません。
これがコードです
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, OPTIONS"); // will need to enable other methods when/as implemented
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
((HttpServletRequest) servletRequest).getHeader("Access-Control-Request-Headers"));
filterChain.doFilter(servletRequest, servletResponse);
}
このリクエストと Chrome からのレスポンス (Access-Control-Allow-Headers の値をハードコーディングしたとき)
Remote Address:10.199.240.16:443
Request URL:https://myapp.com/gradebooks/5566669e-e4b0-d05e-0150-98d7ffffffff/assignments/3ad7f1e7-679b-4d8b-856e-d2e3589eaad6
Request Method:OPTIONS
Status Code:200 OK
Response Headers
view source
Access-Control-Allow-Methods → POST, PUT, GET, DELETE, OPTIONS
Access-Control-Max-Age → 3600
Content-Type → application/hal+json; charset=UTF-8
Date → Tue, 21 Jul 2015 20:42:29 GMT
Server → Jetty(9.2.9.v20150224)
Transfer-Encoding → chunked
X-Application-Context → application
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:PUT
Connection:keep-alive
Host:gbservices-api.dev-prsn.com
Origin:http://localhost:3000
Referer:http://localhost:3000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
これがエラーです
XMLHttpRequest はhttps://myapp.com/gradebooks/5566669e-e4b0-d05e-0150-98d7ffffffff/assignments/3ad7f1e7-679b-4d8b-856e-d2e3589eaad6を読み込めません 。要求ヘッダー フィールド Content-Type は、Access-Control-Allow-Headers では許可されていません。
フィルターへのデバッグで見つかったのは、フィルターに到達するまでに Access-Control-Request-Headers とそのヘッダーのみが欠落していることです。ヘッダーのスペルを間違えて到着するため、何かがヘッダーを傍受し、フィルターに到達する前に破棄しているようです...