异常信息
spring web项目,登录成功后,将用户信息存入session,然后跳转到后台首页再次查询用户信息,通过request.getSession().getAttribute(“userKey”)的方式获取session中的用户信息时,值为空。
异常分析
登录成功后,后端接口通过sendRedirect的方式在内部跳转到后台首页接口,刚开始以为是sendRedirect导致的session丢失,于是在跳转之前对url进行了encodeRedirectURL处理,如下
String encodedUrl = getResponse().encodeRedirectURL(CommonConstants.url);
getResponse().sendRedirect(encodedUrl);
当浏览器禁用Cookie时,该方法会在URL中自动附加;jsessionid=xxx参数(如/path;jsessionid=123),确保会话状态可跟踪。若Cookie已启用或无需编码,则返回原URL不变。
但是encodeRedirectURL之后还是获取不到。后来用Fiddler监控网络请求,发现跳转前的地址和跳转后的地址不一样,一个是Ip地址,一个是localhost,也就是跨域访问了。
由于浏览器对跨域请求进行了限制,尤其是涉及Session等敏感信息时,会阻止非同源请求访问其他域Session。这是同源策略 (Same-Origin Policy)的安全机制,防止跨站攻击(如CSRF、钓鱼网站等)。
解决办法
将跳转前的地址和跳转后的地址改成一样(http协议、ip地址、端口一致),防止跨域访问。