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可以直接

 
以这种形式下载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 + ",欢迎来到宜立方购物网![退出]";
					var html = username + ",欢迎来到宜立方购物网![退出]";
					$("#loginbar").html(html);
				}
			}
		});
	}
}

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

服务器接收到请求

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

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

/**
 * 改进配合js的跨域ajax请求,老版本spring4.2以前的用设置返回值类型application/json来达到目的
* 客户端发送的跨域请求为http://localhost:8090/user/token/6cb7514c-6efc-4c77-8a17-dc524f92dbcc?callback=jsonp1528434107961 * @param token 客户端cookie中发送过来的用户令牌 * @param callback jquery提供的jsonp请求参数名,这个参数不能改!改必错~~~ * @return 返回一条json结果字符串,将字符串放到callback{}的大括号中并返回
* 如: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对象就好
* @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利用jquery的jsonp来解决ajax跨域请求被浏览器拦截结果的问题_第2张图片


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






你可能感兴趣的:(WEB,java)