ajax 自定义header跨域时, option的处理

post(或GET)跨域请求时,分为简单请求和复杂请求,至于如何算简单,如何算复杂,不想研究,反正带了自定义头时是复杂请求。

复杂请求会先发送一个method 为option的请求,目的是试探服务器是否接受发起的请求. 如果服务器说可以,在post请求。

服务器 处理这个option时如何说yes:

对于 java后台web应用,跨域需要添加一个过滤器(你也可以去配置tomcat,不优雅而已.)

public class CorsFilter implements Filter{

 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest)servletRequest;
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        httpResponse.addHeader("Access-Control-Allow-Origin", "*");
        httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, accessToken");
        httpResponse.setHeader("Access-Control-Allow-Methods", "GET, PUT, DELETE, POST,OPTIONS");
       
        if(httpRequest.getMethod().equalsIgnoreCase("OPTIONS")){
            httpResponse.setStatus(202);
            httpResponse.getWriter().close();
            return;
        }
   
        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    @Override
    public void destroy() {
 
    }

}

然后在web.xml中加入该过滤器。

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>xxx.xxx.xxx.CorsFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这个过滤器做的事就是,加了几个http header在返回中,

Access-Control-Allow-Origin 我能接受的跨域请求来源,配置主机名(www.abc.com), * 表示爱谁谁,都行

Access-Control-Allow-Headers 表示能接受的http头部,别忘了加入你自己发明创造的头部

Access-Control-Allow-Methods 表示能接受的http mothed ,反正就那几种,全写上也无妨,猥琐点就只写 post, options

如果是OPTION返回空,设置返回码为202.

202的意思就是 come on,来嘛,英雄 ,也就是say yes

done!

 

 

 

Guess you like

Origin blog.csdn.net/mzr122/article/details/86672964