跨域常用解决方案之JSONP和CORS

JSONP

(1)写法1:

function testJsonp1(){
	$.ajax({
		type: "get",
		url: "http://xxx.com/jsonp",
		cache: false,
		data: {},
		dataType: "jsonp",
		jsonp: "callback",
		jsonpCallback:"这里指定回调函数名",
		success: function (result) {
			alert(result.code+result.msg);
		}
	});
}

(2)写法2:

function testJsonp2(){
	$.ajax({
		type: "get",
		url: "http://xxx.com/jsonp",
		cache: false,
		data: {},
		success: function (result) {
			alert(result.code+result.msg);
		}
	});
}

(3)jsonp默认为“callback”,可以不指定jsonpCallBack

(4)服务端代码:

String call=request.getParameter("callback");
return call+"("+JSON.toJSONString(baseResult)+");";


CORS

(1)简单方法请求:

客户端jquery不需要任何设置,服务端代码如下:
response.addHeader("Access-Control-Allow-Methods","GET,POST");
response.addHeader("Access-Control-Allow-Origin", "*");

为了安全起见,Access-Control-Allow-Origin可以自己指定。

(2)如果客户端请求时需要带上cookie

客户端jquery代码需要打开Credentials:
function testCors(){
	$.ajax({
		type: "post",
		url: "http://xxx.com/cors",
		cache: false,
		data: {},
		dataType: "json",
		xhrFields:{
			withCredentials:true
		},
		success: function (result) {
			alert(getCookie("cookieXxx"));
		}
	});
}

服务端代码如下:
response.setHeader("Access-Control-Allow-Origin",request.getHeader("origin"));
response.setHeader("Access-Control-Allow-Methods","GET,POST");
response.setHeader("Access-Control-Allow-Credentials","true");

需要说明2点:
  • 客户端要传cookie时,Access-Control-Allow-Origin只能是客户端的Origin;
  • 由于cookie还是受同源策略限制,所以客户端通过js还是获取不到服务端返回的cookie的,但是客户端下次请求时会带上服务端之前回写的cookie,一般是应用于单点登录。

(3)客户端请求时要带上自定义的header

客户端代码如下:
function testCors(){
	$.ajax({
		type: "post",
		url: "http://xxx.com/cors",
		cache: false,
		data: {},
		dataType: "json",
		beforeSend: function (xhr) {  
           		xhr.setRequestHeader("Test-Xxx", "xxx");  
        	}, 
		success: function (result, status, xhr) {
			alert(xhr.getResponseHeader("Xxx"));
		}
	});
}

服务端代码如下:

response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods","GET,POST");
if (request.getMethod().equals("OPTIONS")) {
    response.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
response.setHeader("Access-Control-Allow-Headers","Test-Xxx");
response.setHeader("Access-Control-Max-Age","10");

需要说明几点:
  • 对于自定义请求头的,浏览器会先发送一个方法为OPTIONS的预请求,询问服务端是否设置允许该自定义的请求头;
  • 由于每次请求都要先进行预请求,比较影响性能,所以可以设置访问控制的缓存时间,使用Access-Control-Max-Age,单位是秒,使用Chrome浏览器测试时如果不设置,浏览器会默认5秒内不进行OPTIONS预请求;
  • 跟上面的cookie一样,header也受同源策略的限制,客户端js是读取不到服务端设置的header的。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值