【发布时间】:2016-03-29 19:37:05
【问题描述】:
后端由Spring MVC开发,托管在tomcat中。
当我在 Chrome 中使用 postman 开发工具测试端点(Restful)时,一切正常。 “Access-Control-Allow-Origin”、“*”成功添加到服务器。像下面的截图
但是当我编写 Ajax 时提出了同样的要求。因为浏览器有 Origin Policy(postman 没有这个策略),它会先向服务器发送一个 HTTP OPTIONS 请求头来判断实际请求是否可以安全发送。像下面的截图。
响应头与我从邮递员那里得到的完全不同,并且头中没有“Access-Control-Allow-Origin”,“*”。我认为服务器无法接受选项请求。
我试图通过查看此链接在 tomcat web.xml 中添加过滤器:http://enable-cors.org/server_tomcat.html
只有使用没有 Origin 策略的开发工具(如 curl 和 postman)才能完美运行。但它不适用于 Ajax 浏览器。
请看下面的过滤器类
public class SimpleCORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
System.out.println("test123");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
我在过滤器中使用System.out.println("test123");,当使用邮递员或curl时,它在控制台中打印了'test123',但在使用浏览器时没有打印,所以我猜是浏览器发送了OPTIONS请求,并且过滤器没有拦截它,或者其他东西首先拦截了来自浏览器的请求?
谁能帮帮我?谢谢。
【问题讨论】:
-
您可以尝试在响应标头中添加
Access-Control-Allow-Credentials: true -
也尝试设置
Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
标签: javascript spring-mvc tomcat cross-domain cors