一、 背景
现场同事反映,生产环境报错,数据平台无法从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的方式。