欢迎关注微信公总号run的编程生活, 专注于分享优质文章~
什么是CORS
全称是Cross-Origin Resource Sharing, 简单点说, 允许一个网站访问非同源一个网站的资源, 这两个网站的不同点是他们的网址当中的协议, 域名, 端口号任意之一不同
列如
http://xwl:8001 | http://xwl:8002 | 端口号不同 |
---|---|---|
http://xwl:8001 | http://xw:8002 | 域名不同 |
使用nginx碰到的跨域问题
通过浏览器console功能, 获取跨域问题具体信息
- List itemThe ‘Access-Control-Allow-Origin’ header contains multiple values , "", but only one is allowed
白话文的意思就是 多重跨域, 在nginx, 或者是java代码中重复设置了跨域配置
解决方案
解决跨域的话, 一般在controller层加上@CrossOrign注解便可解决
这里我们采用在java代码使用配置类, 来解决跨域, 所以nginx里面的nginx.conf文件不需要设置有关跨域的信息
@WebFilter(filterName = "MyFilter", urlPatterns = {"/*"})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
response.addHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
response.setHeader("Access-Control-Allow-Headers", "Cache-Control,Pragma,Content-Type,Token, Content-Type");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "2500");
response.setHeader("Access-Control-Allow-Credentials", "true");
String method = request.getMethod();
if (method.equalsIgnoreCase("OPTIONS")) {
servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
上述代码遗留的小问题 (图片上传时, 仍然报跨域错误)
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Cache-Control,Pragma,Content-Type,Token, Content-Type");
改为
response.setHeader("Access-Control-Allow-Headers", "*");
意思就是允许请求访问所有的资源, 列如图片, 文件等等
在java项目推荐使用*号, 简单快捷