前端http请求后端接口,session id变了
我前端先请求了后台的登录接口,提示登录成功了。 然后我再请求数据,这时候接口返回来的是未登陆,查了下发现session id变了,所以后台判断还是未登陆。
js代码:
$(function(){
$.get("http://server/admin/login/?adminName=root&password=123123",function(data){
console.log(data); //return log in success
$.get("http://server/admin/users?page=1&count=10",function(data){
console.log(data); // return 'not log in'
})
})
})
后台的java代码:
public Object login(HttpServletRequest request,HttpServletResponse response){
try{
String adminName = request.getParameter("adminName");
String password = request.getParameter("password");
CheckUtils.checkNotNull(ErrorCode.PARAM_NOT_ENOUGH, adminName , password);
logger.info("sessionId"+ request.getSession().getId());// sessionId changed
Admin admin = adminService.login(adminName,password);
return new ModelView(admin);
}catch(Exception e){
return new ModelException(e).getModelView();
}
}
public Admin login(String adminName, String password) {
Admin admin = adminRepo.getAdminByName(adminName);
CheckUtils.checkNotNull(ErrorCode.ADMIN_NAME_ERROR, admin);
CheckUtils.checkTrue(ErrorCode.ADMIN_PASSWORD_ERROR, "password wrong", admin.getPassword().equals(StringUtil.encryptToMd5(password)));
admin.filter();
sessionAuth.addSession(admin);
return admin;
}
在js里面请求session id就变了,但是我把接口连接拿出来 直接浏览器访问,先访问登录接口,再访问请求数据的接口,这时候是可以拿到数据的,而且session id也没变,这是什么原因?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
个人感觉是异步的问题
初始状态下域名的cookie中是不会有session id的值的,此时发送请求$.get("http://server/admin/login/?adminName=root&password=123123"),服务器发现你的浏览器还没有一个Session id,就会帮你随机生成一个,然后处理完请求后,在header告诉浏览器set cookie: jsessionId=XXX
如果浏览器处理了这个语句,那么你第二个请求$.get("http://server/admin/users?page=1&count=10")发送时,服务器就能找到正确的Session,这种情况也就是你后来调试的情况
但是按之前的代码来说浏览器没有真正的去执行这个语句,所以你第二次请求依然还没有sessionId,于是服务器会帮你自动生成一个不一样的
我不太清楚浏览器处理这个的机制,但是个人感觉应该不是同步而是异步的,这样的话你需要稍等一小段时间,setTimeout一下
是不是禁用cookie了
有两个问题
1.按照http的规范,应该是第一个方法用的是post而不是get
2.我觉得这个问题应该可以这样去解释,第二位朋友说的是很有道理的,其实你可以打开调试器看header中第二个请求是否使用了第一个请求返回的sessionid进行再次请求,如果不是的话,就可以找另外的解决方案。
因为不做前端几年了- -不能给出具体的解决方案,十分不好意思。
很多系统都会有要求登录后修改sessionid,改成在浏览器访问的时候你登录了之后后台会给浏览器返回一个新的sessionid(会话),第二个请求的时候浏览器会带上新的会话去请求所以能访问成功。
用jQuery的时候第二个请求不会带上第一个请求返回的会话信息,所以后台服务器拒绝你的请求。
如果需要请求带会话的接口(我不知道怎么用js带会话请求后台服务),你可以请求到自己的后台服务,自己的后台服务来获取 接口的会话信息然后去请求相应的接口再返回给前端。