记一次chrome浏览器升级到85版本引发的Session失效问题

一、 背景

现场同事反映,生产环境报错,数据平台无法从Session中获取用户名。技术框架采用的是Shiro + SpringBoot。该问题在开发环境无法复现。

后来出差到现场之后,了解情况为第三方平台会调用我方的数据平台,并嵌套展示在对方的平台上。我方平台单独展示无问题,但是嵌套调用报Session获取用户名异常

二、分析

依赖shiro框架获取用户名的代码如下

ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();

if (shiroUser != null) {

return shiroUser.getLoginName()

}

从代码中可知,用户名从Session中获取。 猜测是Session异常。 怀疑是重复登录、登录失效,以及跨域请求失效。

逐一排除之后,将问题定位为跨域请求问题。 网上搜索chrome跨域请求相关资料,得知chrome在85版本更新了安全策略,跨域请求无法携带cookie。

三、故障修复

解决方法: 将chrome浏览器版本降低到85以下, 问题解决。 

其他可能的解决方案:

1. 85以上chrome浏览器版本,可以在设置中禁用SameSite安全策略

2. 不要使用iframe进行页面嵌套,而是采用弹出新窗口的方法。

3. 在response header中设置cookie属性为。  SameSite=None;Secure=True, 同时启用https

4. 不要用cookie共享用户,而是采用token的方式。 

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容