这两天,我遇到了由JSESSIONID频繁变化引起的问题。 虽然花了两天时间,但最后问题已经解决,但对于原因,以及在跟踪那个问题时遇到的几个疑问,我还不能接受。 首先记录下来,让遇到同样问题的人尽快解决这个问题。
让我先说一下项目的背景
这是一个维护较早的项目,是一个SSM框架,使用shrio进行权限管理。 shiro的会话id设置为sid,servlet的会话id为JSESSIONID。 最近,根据公司的要求集成了新的单点登录,该单点登录将信息填充到会话中。
整合完成后发送到网上时会出现问题。 页面经常报告域之间的错误。 我仔细排除后,发现了问题的直接原因。 也就是说,保存在浏览器端的JSESSIONID经常更改。 JSESSIOINID更改后,如果进入单点登录过滤器并清空session信息,则返回302重定向,发送到页面的ajax请求将返回302,并请求其他域名
然后在解决这个问题的过程中遇到了以下问题
1、如果不在浏览器中打开开发者模式,就没问题。 按F12打开开发人员模式时会出现此问题。 chrome、edge和IE11有这个问题,而firefox没有这个问题。 我还没想好为什么会这样。 因为如果以前没有在IE中打开开发人员模式,则会缓存一些get请求,但在开发过程中通常是打开的
2、本地调试时没有问题,只有向服务器公开时才有问题。 服务器上和本地的区别在于,以前挂有nginx,绕过nginx直接访问服务器时未发现问题
3、在排查过程中,我仔细查看了所有请求的请求头和响应头的信息,发现响应头中有set-Cookie,设置了新的JSESSIONID值,后面请求头中的JSESSIONID值会突然发生变化
直接说明解决方法。 在nginx上设置proxy_cookie_path解决了问题
中途参考了以下文章
3359 www.cn blogs.com/zang dalei/p/6021352.html
3359 www.cn blogs.com/hei oray/p/10329532.html