先来个表。页面太多对不起我也不知道这张表是从哪个博客保存过来的,所以无法注明博客地址。非常抱歉。
URL |
说明 |
是否允许通信 |
http://www.a.com/a.js |
同一域名下 |
允许 |
http://www.a.com/lab/a.js |
同一域名下不同文件夹 |
允许 |
http://www.a.com:8000/a.js |
同一域名,不同端口 |
不允许 |
http://www.a.com/a.js |
同一域名,不同协议 |
不允许 |
http://www.a.com/a.js |
域名和域名对应ip |
不允许 |
http://www.a.com/a.js |
主域相同,子域不同 |
不允许 |
http://www.a.com/a.js |
同一域名,不同二级域名(同上) |
不允许(cookie这种情况下也不允许访问) |
http://www.cnblogs.com/a.js |
不同域名 |
不允许 |
事实上跨域访问是成功了的,结果其实也是返回来了的,但是浏览器发现是ajax跨域请求,就把结果给墙掉了,但是js可以直接
<script type='text/javascript' src='xxx.xxx.xxx.js'></script>
上面的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方法就能够进行处理了。看成功后的回调函数,我就不解释了。就写到这。