对于我的Web应用程序,我使用tomcat声明性安全性将登录凭据绑定到公司Active Directory。在我们的两台服务器上,登录在一分钟不活动后超时。在另外两台服务器上,有30分钟的超时时间(这就是我想要的)。
Yeseterday,我找到了问题的原因。具有一分钟超时的两个服务器启用了tomcat Persistence Manager以将会话信息写入磁盘。我们的IT人员本周已经出局了,所以我不知道他试图用这个完成的具体细节,但他在context.xml中将PersistenceManager设置为这样:
<Manager sessionIdLength="64" className="org.apache.catalina.session.PersistentManager"
maxIdleBackup="10" maxIdleSwap="30">
<Store className="org.apache.catalina.session.JDBCStore" dataSourceName="jdbc/Auth"
sessionTable="sessions" sessionAppCol="app_name" sessionDataCol="session_data" sessionIdCol="session_id"
sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive" sessionValidCol="valid_session" />
</Manager>
我做了一些研究,发现空闲数字只有几秒钟。认为可能是罪魁祸首我将经理部分改为:
<Manager sessionIdLength="16" className="org.apache.catalina.session.PersistentManager"
maxIdleBackup="600" maxIdleSwap="3600" minIdleSwap="1800">
这解决了我的问题。因此,似乎迫使持久性管理器在三十秒不活动后将会话写入磁盘会导致我的会话登录被终止。我跟踪了JSESSIONID cookie,发现即使用户被强制返回登录界面后,cookie也保持不变。它只会在您重新登录时更改。这是您所期望的,因为将会话持久保存到磁盘不可能更改会话ID。但是,它确实导致我的声明性安全模型强制用户再次登录。
我确实在手册中发现maxIdleSwap变量不仅控制到磁盘的持久会话,而且还导致“将会话钝化到服务器内存之外”。这听起来有些可疑。
有没有人对此问题有任何经验?为什么持久性管理器会在将会话保留到磁盘时终止我的Web应用程序登录?有没有像我一样改变交换控制变量的方法?