浏览器对简单跨域请求和复杂跨域请求的处理:
简单跨域请求:
XMLHttpRequest会遵守同源策略(same-origin policy). 也即脚本只能访问相同协议/相同主机名/相同端口的资源, 如果要突破这个限制, 那就是所谓的跨域, 此时需要遵守CORS(Cross-Origin Resource Sharing)机制
如果想允许跨域, 在服务端设置Access-Control-Allow-Origin: *就可以了
复杂跨域请求:
preflighted request
preflighted request在发送真正的请求前, 会先发送一个方法为OPTIONS的预请求(preflight request), 用于试探服务端是否能接受真正的请求,如果options获得的回应是拒绝性质的,比如404\403\500等http状态,就会停止post、put等请求的发出
什么情况下请求会变成preflighted request呢?
1、请求方法不是GET/HEAD/POST
2、POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
3、请求设置了自定义的header字段如何解决preflighted request?
定义过滤器,在过滤器内排除OPTIONS
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; if(!"OPTIONS".equals(request.getMethod().toUpperCase())) {//避免跨越 doSomething... } filterChain.doFilter(request, response);//doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源 }