[英]Javascript - No 'Access-Control-Allow-Origin' header is present on the requested resource
[英]No Access-Control-Allow-Origin header is present on the requested resource
我想访问来自相同域但具有不同端口号的信息,为了允许这一点,我将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
执行时第一次出现。 第二次它允许。
我的问题是servlet
或jQuery
代码中是否缺少?
任何建议将不胜感激。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.