跨域是浏览器的安全策略,浏览器的ajax请求只支持同域名的访问,但是现在普遍都是前后端分离的开发方式,前端域名和后台域名往往不一致,这时就需要后台在响应头里面加个允许跨域的字段。
如果在每个controller里面加这个响应头会非常繁琐,所以需要用到过滤器,处理所有请求。
这里需要注意一下的是chrome遇到跨域请求时会发送一个option请求,如果这个option请求正常返回才会发送正常请求,遇到这个option请求需要处理下,不然接口会被调用两次
@WebFilter(filterName = "simpleCORSFilter", urlPatterns = "/*")
@Component
public class SimpleCrossFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
// 如果是OPTIONS则结束请求
if (req instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) req;
if (HttpMethod.OPTIONS.toString().equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpStatus.OK.value());
return;
}
}
filterChain.doFilter(req, res);
}
@Override
public void destroy() {
}
}
发送一个请求,可以看到响应头里面已经加上了允许跨域的字段
?
参考项目(模块: SpringBoot-HelloWorld): https://gitee.com/huatin/java-test
?
本文暂时没有评论,来添加一个吧(●'◡'●)