js应该怎么写?
var E3MALL = {
checkLogin : function(){
//使用Jquery的Cookie插件拿到Cookie值
var _ticket = $.cookie("token");
//判断Coolie值是否拿到,如果没有拿到,说明没有登陆
if(!_ticket){
return ;
}
//如果拿到那么就表示已经登陆,我们发送Ajax跨域请求
/**
* dataType : "jsonp" Jquery提供,表示这是一个跨域请求,默认会有一个callback参数提交
* 到服务器,然后服务器配合返回,其实底层走的是拼装的js语句,因为浏览器不支持
* 跨域请求,但是浏览器支持跨域加载Js文件,底层是利用scirpt标签
*/
$.ajax({
url : "http://localhost:8088/user/token/" + _ticket,
dataType : "jsonp",
//应该是必须为get,要不然参数无法拼装
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>";
//html方法,会把以前的内容全部覆盖掉
$("#loginbar").html(html);
}
}
});
}
}
$(function(){
// 查看是否已经登录,如果已经登录查询登录信息
E3MALL.checkLogin();
});
服务器端应该怎么配合呢?
/**
* 第二种方式解决,Spring4.1之后进行支持
* 既然返回的是对象又有@ResponseBody,所有我们不用指定Content-Type
* @param token
* @param callback
* @return
*/
@RequestMapping(value = "/user/token/{token}")
@ResponseBody
public Object getUserByToken(@PathVariable String token,String callback){
E3Result e3Result = tokenService.getUserByToken(token);
//判断是不是跨域请求
if (StringUtils.isNotBlank(callback)) {
//使用Spring提供的方法配合实现跨域请求,就是免去了我们进行拼装
MappingJacksonValue jacksonValue = new MappingJacksonValue(e3Result);
//设置回调函数名
jacksonValue.setJsonpFunction(callback);
return jacksonValue;
}
return e3Result;
}
第一种方式
/**
* 根据前台Ajax传过来的token,查询用户信息
* callback:配合JQeury进行跨域访问
* 响应的时候,要拼装成Js语句返回
* 这时候返回的数据类型就要改成由E3Result改为String,这种情况下又有一个问题
* 就是浏览器,会把这个字符串默认当人text/html处理而不是application/json
* 我们可以设置produce来改变成application
* @param token
* @return
*/
@RequestMapping(value = "/user/token/{token}" , produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String getUserByToken(@PathVariable String token,String callback){
E3Result e3Result = tokenService.getUserByToken(token);
//判断是不是跨域请求
if (StringUtils.isNotBlank(callback)) {
//是,拼装js语句
return callback + "(" + JsonUtils.objectToJson(e3Result) + ");";
}
return JsonUtils.objectToJson(e3Result);
}