spring mvc+Ajax跨域请求-CORS方式

关于跨域问题,主要用的比较多的是cros跨域和JSONP跨域,JSONP跨域我已经在另一篇博客中写了,这里主要说的是CORS方式的跨域。html

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它容许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。前端

基本思路就是在每一个http请求的时候添加一些附加的头信息,如:Origin:http://172.18.2.222:8080,Origin字段指的是访问来源,服务器根据这个值,决定是否赞成此次请求。若是Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误没法经过状态码识别,由于HTTP回应的状态码有多是200。(我就在这个地方卡住了,服务器正常返回了数据,可是success回调函数一直捕获不到,老是被error函数捕获。以前一直都不知道有CORS的跨域方式,一直在使用JSONP的方式!!!)

    服务器只要指定回应头的:Access-Control-Allow-Origin,就能实现跨域了,这个Access-Control-Allow-Origin的参数设置为Origin的源就能够了。相比JSONP方式,CROS的跨域前端页面和后台不须要作出任何更改。

那么,如何设置服务器的响应头呢?java

下面上代码:web

package com.fh.plugins.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

@Component
public class MyCORSFilter implements Filter {
	 @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String origin = (String) servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort();
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
        response.setHeader("Access-Control-Allow-Credentials","true");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

定义一个过滤器,为全部的http请求都加上Access-Control-Allow-Origin的头。ajax

web.xml的配置:spring

<filter>
	  <filter-name>cors</filter-name>
	  <filter-class>com.fh.plugins.filter.MyCORSFilter</filter-class>
	</filter>
	<filter-mapping>
	  <filter-name>cors</filter-name>
	  <url-pattern>/*</url-pattern>
	</filter-mapping>

前端页面直接使用Ajax请求便可:跨域

$.ajax({
		  	url:URL+"h5Logs/getIMEI.do",
		  	type:"get",
			success:function(data){
				//alert(data);
				var imei_modes = data.split(";");
				setCookie("IMEI",imei_modes[1],"d30");
				setCookie("user_model",imei_modes[0],"d30");
				setCookie("operators",imei_modes[2],"d30");
	         
			}
		});

对于只知道JSONP的跨域方式的同窗来讲(就是我...), CROS跨域简直太美妙了!!!浏览器

参考博客:服务器

http://www.ruanyifeng.com/blog/2016/04/cors.htmlapp

http://www.cnblogs.com/asfeixue/p/4363372.html

相关文章
相关标签/搜索