CORS問題まとめ一

4694 ワード

サービス端末(SpringMVC)
フィルタのコードは以下の通りです.
			String origin = reqs.getHeader("origin");//     
			String requestHeaders = reqs.getHeader("Access-Control-Request-Headers");
			if (StringUtils.isEmpty(requestHeaders)) {
				requestHeaders = "";
			}
			httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
			httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
			httpServletResponse.setHeader("Access-Control-Allow-Methods", "HEAD,PUT,DELETE,POST,GET");
			httpServletResponse.setHeader("Access-Control-Allow-Headers", "Accept, Origin, XRequestedWith, Content-Type, LastModified," + requestHeaders);
効果
ドメインをまたぐ第一歩
CORS问题总结一_第1张图片
二股
CORS问题总结一_第2张图片
よくある問題
在这里插入图片描述
Access to XMLHttpRequest at 'http://10.10.1.49:9000/liinji_mobile_web/SelfInspection/getSelfInspection' from 
origin 'http://localhost:63342' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: 
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' 
when the request's credentials mode is 'include'. The credentials mode of requests initiated by the 
XMLHttpRequest is controlled by the withCredentials attribute.
エラーの原因
要求された根拠パターンがincludeである場合、対応するAccess-Coontrol-Originヘッダの値はワイルドカード「*」ではなく、要求定義にwithCredentialsフラグを設定すると、要求にcookieなどを伝達する.サーバが任意のset-cookie応答ヘッダに戻るなら、Access-Coontrol-Chredentials:trueに戻らなければ、クライアントにcookieを作成しません.このように設定すると、Access-Control-Origin応答ヘッダを同時に指定する必要があります.Access-Coontrol-Allow-Originは適切な指定が必要で、ワイルドカード(*)ではなく、WithCredentialsはクロスドメインセキュリティポリシーの一つです.
アドバイス
ネット上の大部分にかんがみて(以下の通り)
		//      * 
		response.setHeader("Access-Control-Allow-Origin", "*"); 
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
        response.setHeader("Access-Control-Allow-Credentials", "true");
個人的な感覚ですが、必要なものがあればお勧めします.
		String origin = request.getHeader("origin");//     
		httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
よくある問題2
在这里插入图片描述
Access to XMLHttpRequest at 'http://10.10.1.49:9000/liinji_mobile_web/SelfInspection/getSelfInspection' from 
origin 'http://localhost:63342' has been blocked by CORS policy: Request header field Token is not allowed by 
Access-Control-Allow-Headers in preflight response.
エラーの原因
Request Headersの中のAccess-Coontrol-Lequest-HeadersとReponse Headersの中のAccess-Coontrol-Headersが一致しないため、図CORS问题总结一_第3张图片のようになっています.
アドバイス
Request Headersの中のAccess-Coontrol-request-Headersはいろいろありますので、個人的には以下のように提案します.
			//   request  Access-Control-Request-Headers  
			String requestHeaders = request.getHeader("Access-Control-Request-Headers"); 
			if (StringUtils.isEmpty(requestHeaders)) {
				requestHeaders = "";
			}
			httpServletResponse.setHeader("Access-Control-Allow-Headers", "Accept, Origin, XRequestedWith, Content-Type, LastModified," + requestHeaders);