前后端分离的项目,测试的时候与前端联调的时候发现,出现了跨域请求的问题。浏览器默认会向后端发送一个Options方式的请求,根据后端的响应来判断后端支持哪些请求方式,支持才会真正的发送请求。
1. CORS(Cross-Origin Resource Sharing 跨源资源共享)
当一个请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.
这样的报错。这样的错误,一般是由于CORS跨域验证机制设置不正确导致的。
2. 解决方案
2.1 新建CorsFilter,在过滤器中设置相关请求头
/**
* Json拦截 判断是否跨域
*
* @author zgldo
*
*/
public class CORSFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) sresponse;
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE,OPTIONS");
response.addHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header");
response.addHeader("Access-Control-Max-Age", "1800");// 30 min
chain.doFilter(srequest, sresponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
2.2 在web.xml中添加Filter配置
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.zhougl.filter.CORSFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
网友评论