使用Servlet 3.0编程安全性时如何处理会话超时

Pat*_*ner 5 java jaas java-ee servlet-3.0

关于Servlet 3.0编程安全性,当会话超时时无法调用HttpServletRequest#logout().

用户是否仍然登录JAAS?

如果是这样,在会话超时后处理JAAS注销的最佳做法是什么?

容器如何处理用户后续再次登录的请求并在会话超时后创建新会话?

另外,在使用Servlet 3.0编程安全性时,使用以下三种方法处理会话超时的优缺点是什么:

  1. HttpSessionListener#sessionDestroyed()
  2. 制作@ManagedBean @SessionScoped LoginManager工具HttpSessionBindingListener并做一些事情valueUnbound.
  3. 使用@PreDestroy在LoginManager中注释方法.

任何其他建议的方法/最佳实践建议肯定会受到赞赏.

use*_*421 3

Servlet 规范中的某处有这样的声明,大意是会话无效恰好对应于其中没有主体的状态。这是关键。logout() 和 timeout 都会使会话无效,并且使会话无效会从中删除主体及其所有值绑定。

JAAS 真正做的就是允许LoginModules在 a 中累积Subject用户及其角色的委托人。JAAS方法真正需要做的就是清除由同一模块的方法(或更可能是方法logout())添加的主体的主题,如果您向主题添加了诸如私有凭据之类的内容,这实际上只是为了总体安全性。由于 logout() 不会由与 login()/commit() 相同的实例执行,因此删除必须基于主体类而不是基于主体的内部集合。login()commit()

当会话过期时,JAAS logout() 不会被调用,但是当主体从会话中删除时,这对任何人来说都不重要。

如果您想因其他原因(例如日志记录)跟踪会话终止,请让您的用户 bean 成为会话绑定侦听器,并在 valueUnbound() 方法中将终止记录为注销:根据我的经验,这是 100% 可靠的。

为了回答您的其他问题,不存在“登录到 JAAS”这样的状态:JAAS为容器提供登录/注销服务,而不是为其本身提供登录/注销服务;新登录是进入新会话的新登录,无论前一个会话是否已过期。