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

时间:2012-02-24 05:36:31

标签: java java-ee jaas 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中注释方法。
  4. 任何其他建议的方法/最佳实践建议肯定会受到赞赏。

2 个答案:

答案 0 :(得分:3)

在Servlet规范的某处有一个声明,表明会话无效性恰好与其中没有Principal的状态相对应。这是关键。 logout()和timeout都会使会话失效,会话无效会从中删除Principal及其所有值绑定。

JAAS真正做的就是允许LoginModulesSubject中为主持人积累主持人,包括用户和他的角色。 JAAS logout()方法真正需要做的就是清除由同一模块login()或更可能commit()方法添加的Principal的主题,这实际上只是如果您已向主题添加私人凭据等内容,则可获得全面的安全性。由于logout()不会由与login()/ commit()相同的实例执行,因此该删除必须基于主体类而不是内部主体集合。

当会话到期时,JAAS logout()不会被调用,但是当会话从会话中删除时,对于任何人都不应该真正重要。

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

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

答案 1 :(得分:2)

会话管理与JAAS没有直接关联..会话管理实际上取决于您的容器。

在Jetty 8中,会话管理由SessionManager(在上下文级别)和SessionIdManager(在服务器级别)处理。

浏览器将会话ID发送到服务器。实现SessionManager的类验证会话ID。如果会话过期,会话将失效并被删除,并通知会话侦听器。

我不确定为什么你需要'注销'用户然后你应该能够挂断你的注销听众。

'保持登录JAAS'对您的容器意义不大。 Jetty没有用户/主体/主题缓存,因此您不会“保持登录状态”,除非您自己实现缓存,就像我们一样。

JAAS模块只提供身份验证和授权;没别的。

ADD

会话过期后,服务器返回302并重定向到登录页面。页面上的表单提交调用Login模块(可能是JAAS模块),成功验证后会创建一个新的会话和会话ID,通常通过cookie(或URL重写)发送回浏览器。 / p>

除非您的应用处理所有上下文的单个上下文ID,否则我认为您不应在会话到期时执行任何类型的程序化注销;您可以“使在另一个上下文中仍然具有有效会话的用户”无效。