AjaxのOPTTIONSリクエスト
1318 ワード
ブラウザは、簡単なドメイン間要求と複雑なドメイン間要求に対する処理:
簡単なドメイン間要求:
XMLHttpRequestは、ソースポリシー(same-orign policy)を遵守します。つまりスクリプトは同じプロトコル/同じホスト名/同じポートのリソースにしかアクセスできません。この制限を突破するには、いわゆるクロスドメインです。CORS(Cross-Origin Resource Sharing)マシン制に従う必要があります。
クロスドメインを許可したいなら、サービス先にAccess-Coontrol-Allow-Origin:*を設置すればいいです。
複雑なドメイン間要求:
preflighted request
preflighted requestは、本当の要求を送信する前に、OPTTIONSのための事前要求を送信します。サービス側が本当の要求を受け入れることができるかどうかを確認するために、optionsからの応答が拒否された場合、404\403\500などのhttp状態で、post、putなどの要求の送信を停止します。
どのような状況で要請がpreflighted requestになりますか? 1、要求方法はGET/HEAD/POST 2ではなく、POSTが要求するContint-Typeは、aplication/x-www-form-urlencodedではなく、multiad/form-data、またはtext/plin 3ではなく、カスタムheaderフィールドの設定を要求します。
preflighted requestはどう解決しますか?
フィルタを定義し、OPTONSをフィルタから除外します。
簡単なドメイン間要求:
XMLHttpRequestは、ソースポリシー(same-orign policy)を遵守します。つまりスクリプトは同じプロトコル/同じホスト名/同じポートのリソースにしかアクセスできません。この制限を突破するには、いわゆるクロスドメインです。CORS(Cross-Origin Resource Sharing)マシン制に従う必要があります。
クロスドメインを許可したいなら、サービス先にAccess-Coontrol-Allow-Origin:*を設置すればいいです。
複雑なドメイン間要求:
preflighted request
preflighted requestは、本当の要求を送信する前に、OPTTIONSのための事前要求を送信します。サービス側が本当の要求を受け入れることができるかどうかを確認するために、optionsからの応答が拒否された場合、404\403\500などのhttp状態で、post、putなどの要求の送信を停止します。
どのような状況で要請がpreflighted requestになりますか? 1、要求方法はGET/HEAD/POST 2ではなく、POSTが要求するContint-Typeは、aplication/x-www-form-urlencodedではなく、multiad/form-data、またはtext/plin 3ではなく、カスタムheaderフィールドの設定を要求します。
preflighted requestはどう解決しますか?
フィルタを定義し、OPTONSをフィルタから除外します。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
if(!"OPTIONS".equals(request.getMethod().toUpperCase())) {//
doSomething...
}
filterChain.doFilter(request, response);//doFilter filter , filter
}