web-dev-qa-db-ja.com

要求されたリソースにAccess-Control-Allow-Originヘッダーがありません

同じドメインの情報にアクセスしますが、ポート番号が異なります。これを許可するには、Access-Control-Allow-Origin応答ヘッダー付き。

サーブレットコード:(www.example.com:PORT_NUMBERに存在)

String json = new Gson().toJson(list);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");//cross domain request/CORS
response.getWriter().write(json);

jQueryコード:(www.example.comに存在)

$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'}).done(function(data)
{
    alert(data);
});

何度かこのエラーが表示されます(コンソールで):

XMLHttpRequest cannot load 'http://www.example.com:PORT_NUMBER/MYSERVLET'
No 'Access-Control-Allow-Origin' header is present on the requested resource.

このエラーは、主に$.postが実行されます。 2回目は許可します。

私の質問は、servletまたはjQueryコードに欠けているということですか?

ご提案をいただければ幸いです。

pdate1

私は変わった:

response.setHeader("Access-Control-Allow-Origin", "*");

に:

response.setHeader("Access-Control-Allow-Origin", "http://www.example.com");

次に、コンソールでこのエラーが発生しています:

XMLHttpRequest cannot load http://www.example.com:PORT_NUMBER/MyServletName
The 'Access-Control-Allow-Origin' whitelists only 'http://www.example.com'
Origin 'http://www.example.com' is not in the list,
and is therefore not allowed access.

[注:ホワイトリストとOriginは同じですが、それでもエラーが発生します。それは時々動作し、時には上記のエラーを出します。]

さらに情報が必要な場合はお知らせください。

19
Bhushan

ソリューション
setHeaderメソッドを使用する代わりに、addHeaderを使用しました。

response.addHeader("Access-Control-Allow-Origin", "*");

*上記の行では、すべてのドメインへのアクセスが許可されます。特定のドメインへのアクセスのみを許可する場合:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

IE <= 9に関連する問題については、 こちら をご覧ください。

33
Bhushan

$.post()メソッドに 'json' dataTypeがありません:

$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'})
        .done(function(data){
                  alert(data);
         }, "json");
         //-^^^^^^-------here

更新:

これで試してください:

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

2
Jai

私は spring.io に次のような解決策を見つけました:

    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");
1
Richard Xue

サーブレットでは、サーブレットのサービスメソッドをオーバーライドするだけで、すべてのhttpメソッド(POST、GET、DELETE、PUTなど)のヘッダーを追加できます。

@Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        if(("http://www.example.com").equals(req.getHeader("Origin"))){
            res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
            res.setHeader("Access-Control-Allow-Headers", "Authorization");
        }

        super.service(req, res);
    }