CORSFilter解决前端跨域请求问题 Day21 2018

2018-12-11  本文已影响0人  Ernest_Chou

前后端分离的项目,测试的时候与前端联调的时候发现,出现了跨域请求的问题。浏览器默认会向后端发送一个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>
上一篇 下一篇

猜你喜欢

热点阅读