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

我想访问来自相同域但具有不同端口号的信息,为了允许这一点,我将Access-Control-Allow-Origin响应头添加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. 

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

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

方案
我没有使用setHeader方法,而是使用了addHeader

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

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

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

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

你在$.post()方法中缺少’ $.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")); 

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

在您的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); }