Http Session丢失

近段时间,客户生产环境遇到了一个问题。在点击一些按钮进入新页面时,偶尔会出现空白页面。这个空白页面,是因为后台收到请求后,需要获取HttpSession里的一些参数进行判断,session中少了参数,自然是进不去的。
程序中使用 req.getSession() 来获取session对象,req.getSession()其实就是req.getSession(true),如果有指定id的session,就使用,如果没有,则会创建一个新的session。

无论是在浏览器中调用接口,还是js中的ajax,本质都是一样的,都会往浏览器中写入cookie(如果没有设置禁止cookie的话)。下次请求时,会根据JSESSIONID去服务器找对应的session。
这里我们要处理的事情是,为什么session中的值丢了。
一般来说,session在invalidate()时,会销毁所有的值。这个可以通过实现HttpSessionListener, HttpSessionAttributeListener接口来监控session和值的创建销毁等。

我们加了监听器和调用堆栈信息,发现是由于SSO客户端主动调用了session.invalidate(),导致销毁,对方也没搞懂为什么会主动发起了注销,最后是他们决定让sso服务器不往业务系统执行注销的请求,即
方案一、sso服务器出站规则设置不能访问他们的服务器的ip
方案二、接入系统服务器入站规则设置不能被sso服务器ip访问

方案奏效,这几天确实没有因为这个引起的问题了。

不过今天,又反馈说有问题。经查,又是session没有参数,但却找不到有注销的地方,那这个怎么消失的。世间万物不会凭空地产生,也不会凭空的消失。发现存在大量的创建了新session,却没有设值。最后发现,原来是tomcat被重启过,但是页面却没有提示重新登陆所致。要抓住如何值为何会消失这一点,才可能找到答案。

2017-08-10 08:53:19,069 INFO [session] - [----创建了一个session,id:2860529B8047A10209F33A7AA43891F2,attribuString:,valueString:[]]
2017-08-10 08:53:19,124 INFO [session] - [----增加了一个session值,id:2860529B8047A10209F33A7AA43891F2,名:com.landray.sso.client.EKPSSOClient,值:{}]

另外有可能会引起session改变的地方:
【Http Session丢失】1、response.reset();
2、使用了https后手动改成http访问。浏览器会为不同的协议产生不同的sessionid,
3、超时设置
4、httpclient等工具
5、程序重启





找问题要看准点

    推荐阅读