请求的资源上不存在Access-Control-Allow-Origin标头

时间:2014-01-02 11:05:06

标签: javascript java jquery ajax cors

我想访问来自同一个域但具有不同端口号的信息,为了实现此目的,我将Access-Control-Allow-Origin添加到响应标头中。

Servlet代码:(出现在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执行时第一次出现。第二次允许。

我的问题是servletjQuery代码中是否缺少该内容?

任何建议都将受到赞赏。

UPDATE1

我改变了:

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.

[注意:白名单和原点相同,但仍然会出错。它有时会起作用,并且有时会出现上述错误。]

如果您需要更多信息,请与我们联系。

4 个答案:

答案 0 :(得分:33)

<强>解决方案
我没有使用setHeader方法,而是使用了addHeader

response.addHeader("Access-Control-Allow-Origin", "*");
上面一行中的

*将允许访问所有域,仅允许访问特定域:

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

对于与IE&lt; = 9相关的问题,请参阅here

答案 1 :(得分:2)

您在$.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 :(得分:1)

我在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");

答案 3 :(得分:0)

在servlet上简单地覆盖servlet的服务方法,以便为所有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);
    }