我在 websphere 应用程序服务器 7.0 上部署了 web 应用程序。用户使用 /j_security_check 登录。当会话超时发生会话 ivnvalidates 但 request.getUserPrincipal() 仍然不为空。我希望它应该为空。如何清理用户主体?
3 回答
我在 sphere 文档中找到了解决方案。
- 在管理控制台中,单击安全性 > 全局安全性。
- 在自定义属性下,单击新建。
- 在名称字段中,输入 com.ibm.ws.security.web.logoutOnHTTPSessionExpire。
- 在值字段中,输入 true。
- 单击应用并保存以保存对配置的更改。
- 重新同步并重新启动服务器。
除了 Vadim 提供的解决方案之外,我还想分享两个链接,这些链接描述了几种替代解决方法,并解释了导致这种看似违反直觉的操作模式的机制。
如果您在不同的应用程序之间使用 SSO(单点登录),使用 com.ibm.ws.security.web.logoutOnHTTPSessionExpire=true 设置可能会有一点缺点。此设置实质上使 LTPA 令牌无效。由于服务器上的安全缓存在超时时会从 LTPA 令牌刷新,因此无效的 LTPA 将导致用户重新验证(登录)其余应用程序 [1]。
对 [2] 中的问题 9(似乎与我们的问题相同)的回答提供了针对此问题的两种替代解决方法的想法,您可以使用基于生存期和不活动的 servlet 过滤器来超时身份验证。
[1]:安全缓存、LTPA 令牌和会话超时(需要登录)
要记住的关键是有效/无效的 HTTPSession 与 security 不同。
它们完全不同。
一旦你通过了服务器的身份验证,如果你愿意,你仍然可以在没有任何 HTTPSession 的情况下让应用程序工作。
一旦您被服务器验证,您将获得一个 LTPA 令牌返回到您的浏览器,并且 LTPA 令牌在 2 小时内处于活动状态(这是默认设置)。
如果您的 HTTP 会话过期,如果您不做任何额外的事情,这不会影响 LTPA 令牌。
您可以尝试: ibm_security_logout 这会使 LTPA 令牌无效。
我猜想对于更高版本的 Servlet API,我们确实有一个适当的注销操作可用,这将消除对此的需要。
高温高压
芒鲁