3

对于我的 Web 应用程序,我使用 tomcat 声明式安全将登录凭据绑定到公司 Active Directory。在我们的两台服务器上,一分钟不活动后登录超时。在另外两台服务器上,有三十分钟的超时(这是我想要的)。

昨天,我找到了问题的原因。具有一分钟超时的两台服务器启用了 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 部分更改为:

<Manager sessionIdLength="16" className="org.apache.catalina.session.PersistentManager"
       maxIdleBackup="600" maxIdleSwap="3600" minIdleSwap="1800">

这解决了我的问题。因此,在 30 秒不活动后强制持久性管理器将会话写入磁盘似乎会杀死我的会话登录。我跟踪了 JSESSIONID cookie,发现即使用户被迫返回登录屏幕,cookie 仍然保持不变。仅当您重新登录时才会更改。这是您所期望的,因为将会话持久保存到磁盘不可能更改会话 ID。但是,它确实会导致我的声明式安全模型强制用户再次登录。

我确实在手册中发现 maxIdleSwap 变量不仅控制持久会话到磁盘,而且还导致“会话钝化超出服务器内存”。这对我来说听起来有点可疑。

有没有人有这个问题的经验?为什么 Persistence Manager 在将会话持久保存到磁盘时会终止我的 Web 应用程序登录?有没有办法在不改变交换控制变量的情况下解决这个问题?

4

0 回答 0