这两天遇到一个JSESSIONID频繁变化导致的问题,花了两天时间虽然最后解决了问题,但是对于原因,以及追踪这个问题中间遇到的好几个疑问都还没有想通,先记录下来,以帮助遇到同样问题的人能尽快解决这个问题。

先说下项目背景

这是维护的一个老项目,SSM框架,使用shrio做权限管理,shiro的会话id设置为sid,而servlet的会话id为JSESSIONID,最近根据公司要求集成一个新的单点登录,这个单点登录会往session里塞信息。

集成完成后发到线上就有问题了,页面经常报跨域的错,我经过一番排查发现了问题的直接原因,就是浏览器端保存的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,然后问题就解决了