angularとSpringBootを使用して、サービスに認証を追加しようとしていますが、何らかの理由で、機能することがわかっているURLからデータを「開いて」フェッチすることができません
角度:
this.getMismatches = function () {
return $http({
"async": true,
"crossDomain": true,
"url": GLOBALS.mismatchUrl,
"method": "GET",
"headers": {
"authorization": "Basic YWRtaW46USNROawdNmY3UWhxQDlQA1VoKzU="
}
});
}
(現在、ログイントークンはテスト目的でハードコードされています)
休憩サービス:
@CrossOrigin(origins = "*")
@RequestMapping("/api/mismatch")
public List<Mismatch> home() {
return service.getAll();
}
CrossOrigin = * CORSの問題を処理する必要がありますが、この失敗したURL呼び出しは本当に奇妙です。
私たちが試した追加のこと:
'Access-Control-Allow-Methods', 'GET, POST, OPTIONS'
'Access-Control-Allow-Origin', '*'
'Content-Type', json plaintext jsonp etc
App.js:
$httpProvider.defaults.headers.common = {};
$httpProvider.defaults.headers.post = {};
$httpProvider.defaults.headers.put = {};
$httpProvider.defaults.headers.patch = {};
コメントで、郵便配達員を使用することで期待どおりの応答を得ることができると述べました。それは良い出発点です。ターミナルからcurlコマンドcurl -i -X URL
を使用しても、正しい応答が返されると思います。
Postmanが正しく機能する場合は、リクエストを行う直前にangularがpre-flightリクエストと呼ばれる別のリクエストを送信します。サーバー側のエンドポイントに確認してください。
このリクエストは[〜#〜] options [〜#〜]タイプのリクエストです。
まず、dispatcherServletが[〜#〜] options [〜#〜]リクエストを受け入れることを確認する必要があります。これは、次のような*.properties
構成ファイルで指定することで実現できます。
spring.mvc.dispatch-options-request=true
またはweb.xml
を構成します
<servlet>
<!--content eluded for clarity-->
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
OPTIONSリクエストを受け入れるように設定したら、Filter.Java
を作成し、CORSフィルターを設定します。
次の例でガイドできます。
public class CorsFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
if(response instanceof HttpServletResponse){
HttpServletResponse alteredResponse = ((HttpServletResponse)response);
addCorsHeader(alteredResponse);
}
filterChain.doFilter(request, response);
}
private void addCorsHeader(HttpServletResponse response){
//TODO: externalize the Allow-Origin
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
response.addHeader("Access-Control-Max-Age", "1728000");
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig filterConfig)throws ServletException{}
}
最後に、このフィルターを次のinit-paramsとともにweb.xml
に追加することを忘れないでください。
<filter>
<filter-name>cors-filter</filter-name>
<filter-class>ai.surge.usrmngmtservice.util.cors.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<!--<init-param>-->
<!--<param-name>cors.preflight.maxage</param-name>-->
<!--<param-value>1800</param-value>-->
<!--</init-param>-->
</filter>
あなたは今行く準備ができているはずです。