js利用jquery的jsonp来解决ajax跨域请求被浏览器拦截结果的问题

先来个表。页面太多对不起我也不知道这张表是从哪个博客保存过来的,所以无法注明博客地址。非常抱歉。

URL

说明

是否允许通信

http://www.a.com/a.js
http://www.a.com/b.js

同一域名下

允许

http://www.a.com/lab/a.js
http://www.a.com/script/b.js

同一域名下不同文件夹

允许

http://www.a.com:8000/a.js
http://www.a.com/b.js

同一域名,不同端口

不允许

http://www.a.com/a.js
https://www.a.com/b.js

同一域名,不同协议

不允许

http://www.a.com/a.js
http://70.32.92.74/b.js

域名和域名对应ip

不允许

http://www.a.com/a.js
http://script.a.com/b.js

主域相同,子域不同

不允许

http://www.a.com/a.js
http://a.com/b.js

同一域名,不同二级域名(同上)

不允许(cookie这种情况下也不允许访问)

http://www.cnblogs.com/a.js
http://www.a.com/b.js

不同域名

不允许

事实上跨域访问是成功了的,结果其实也是返回来了的,但是浏览器发现是ajax跨域请求,就把结果给墙掉了,但是js可以直接

 <script type='text/javascript' src='xxx.xxx.xxx.js'></script>
以这种形式下载js文件的,跨域是没有事情的,所以利用这一特性,老师说是bug?好吧,好像是有这么一点道理。

上面的src就里面的js就可以写下面的内容,可以利用jquery,如下,稍微看一下地址就好,说完服务器端后还会说

var E3MALL = {
	checkLogin : function(){
		var _ticket = $.cookie("YLF_USER_COOKIE");		// 需要和浏览器的cookie名字一样,cookie名是服务端发回给浏览器的UUID
		if(!_ticket){
			return ;
		}
		$.ajax({
			url : "http://localhost:8090/user/token/" + _ticket,
			dataType : "jsonp",							// jquery封装好了跨域请求的,需要设置数据类型为jsonp
			type : "GET",
			success : function(data){
				if(data.status == 200){
					var username = data.data.username;
					// var html = username + ",欢迎来到宜立方购物网!<a href=\"http://www.e3mall.cn/user/logout.html\" class=\"link-logout\">[退出]</a>";
					var html = username + ",欢迎来到宜立方购物网!<a href=\"http://localhost:8090/page/login\" class=\"link-logout\">[退出]</a>";
					$("#loginbar").html(html);
				}
			}
		});
	}
}

$(function(){
	// 查看是否已经登录,如果已经登录查询登录信息
	E3MALL.checkLogin();
});

服务器接收到请求


那么,服务端应该这么写(下面包含两个版本,注意看注释!

/**
 * 改进配合js的跨域ajax请求,老版本spring4.2以前的用设置返回值类型application/json来达到目的<br>
 * 客户端发送的跨域请求为http://localhost:8090/user/token/6cb7514c-6efc-4c77-8a17-dc524f92dbcc?callback=jsonp1528434107961
 * @param token 客户端cookie中发送过来的用户令牌
 * @param callback jquery提供的jsonp请求参数名,这个参数不能改!改必错~~~
 * @return 返回一条json结果字符串,将字符串放到callback{}的大括号中并返回<br>
 * 如:jsonp1528434107961({"status":200,"msg":"OK","data":{"id":1,"username":"zhangsan","password":null,"phone":"13488888888","email":"[email protected]","created":1428339835000,"updated":1428339835000}});
 */
@ResponseBody
// @RequestMapping(value = "/user/token/{token}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE/* "application/json;charset=utf-8" */)
public String getUserByTokenOld(@PathVariable String token, String callback) {
	ylfResult result = tokenService.getUserByToken(token);
	// 响应结果之前,判断是否为jsonp请求
	if (StringUtils.isNotBlank(callback)) {
		// 把结果封装成一个js语句响应
		return callback + "(" + JackJsonUtils.objectToJson(result) + ");";
		// jsonp1528434107961({"status":200,"msg":"OK","data":{"id":1,"username":"zhangsan","password":null,"phone":"13488888888","email":"[email protected]","created":1428339835000,"updated":1428339835000}});
	}
	return JackJsonUtils.objectToJson(result);
}

/**
 * 改进配合js的跨域ajax请求,新版本spring4.2以后的直接返回MappingJacksonValue对象就好<br>
 * @param token token 客户端cookie中发送过来的用户令牌
 * @param callback callback jquery提供的jsonp请求参数名,这个参数不能改!改必错~~~
 * @return 一个Object,如果带了callback就返回MappingJacksonValue,如果不带就直接返回对象
 */
@ResponseBody
@RequestMapping(value = "/user/token/{token}")
public Object getUserByTokenNew(@PathVariable String token, String callback) {
	ylfResult result = tokenService.getUserByToken(token);
	// 响应结果之前,判断是否为jsonp请求
	if (StringUtils.isNotBlank(callback)) {
		// 把结果封装成一个js语句响应
		MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
		mappingJacksonValue.setJsonpFunction(callback);
		return mappingJacksonValue;
	}
	return result;
}

那么回到浏览器就是这样子的。



既然已经收到服务器的数据,那么js的ajax方法就能够进行处理了。看成功后的回调函数,我就不解释了。就写到这。






猜你喜欢

转载自blog.csdn.net/qq_36138324/article/details/80621826