请求的资源上不存在访问控制允许源标头

2022-09-02 12:17:34

我想访问来自同一域但具有不同端口号的信息,为了允许这样做,我使用响应标头添加。Access-Control-Allow-Origin

Servlet Code:(出现在 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 code:(出现在 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

任何建议将不胜感激。

更新1

我已更改:

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.

[注意:白名单和来源相同,但仍然给出错误。它有时有效,有时给出上述错误。

如果您需要更多信息,请告诉我。


答案 1

解决方案
我没有使用我使用的方法。setHeaderaddHeader

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

*在上面的行将允许访问所有域,用于仅允许访问特定域:

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

有关 IE<=9 的问题,请参阅此处


答案 2

您在方法中缺少“json”数据类型:$.post()

$.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"));