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!