オリジン間リソース共有 (CORS制御)
---------------------------------------------------------
JSON なら JSONP を使う、異なるオリジンの利用について
抜粋)
ブラウザ上のJSエンジンからAPIサーバを叩く時に避けて通れないのが、Same-Origin Policy(同一生成元ポリシー)による
CORS (Cross-Origin Resource Sharing)制限です。CORS制御で異なるオリジンでもリソースを共有する
--------------------------------------------------------------------------
ヘッダ | 値
---------------------------------------------------------------------------
Access-Control-Allow-Origin | アクセスを許可するOriginのURL。"*"で指定なし。
---------------------------------------------------------------------------
Access-Control-Allow-Methods | 使用可能なメソッド
---------------------------------------------------------------------------
Access-Control-Allow-Headers | 使用可能なリクエストヘッダ
---------------------------------------------------------------------------
Access-Control-Max-Age | preflightの結果をキャッシュしても良い時間(秒)
---------------------------------------------------------------------------
サンプル
-----------------------------
@Componentpublic class CorsFilter extends OncePerRequestFilter{
private static final Logger log = LoggerFactory.getLogger(CorsFilter.class);
// spring boot for java におけるフィルタ処理
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.setHeader("Access-Control-Allow-Origin", "*");//すべてのドメインからアクセス可能
// ブラウザ上のJSエンジンは、APIサーバ(別ドメイン)にリクエストを投げる前にOPTIONSメソッドによるアクセスを行います。
if ("OPTIONS".equals(request.getMethod())) {
response.setHeader("Access-Control-Allow-Methods", request.getHeader("Access-Control-Request-Method"));
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
response.setStatus(HttpServletResponse.SC_OK);
}else {
filterChain.doFilter(request, response);
}
}
}