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

Java 使用Servlet 3.0编程安全性时如何处理会话超时,java,jakarta-ee,jaas,servlet-3.0,Java,Jakarta Ee,Jaas,Servlet 3.0,关于Servlet 3.0编程安全性,当会话超时时,无法调用HttpServletRequest#logout() 用户是否仍然登录到JAAS 如果是这样,在会话超时后处理从JAAS注销的最佳实践是什么 容器如何处理用户随后再次登录并在会话超时后创建新会话的请求 另外,在使用Servlet 3.0编程安全性时,使用以下三种方法处理会话超时的利弊是什么: HttpSessionListener#sessionDestroyed() 使@ManagedBean@SessionScoped Login

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

用户是否仍然登录到JAAS

如果是这样,在会话超时后处理从JAAS注销的最佳实践是什么

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

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

  • HttpSessionListener#sessionDestroyed()
  • 使
    @ManagedBean@SessionScoped LoginManager
    实现
    httpsessionbindingstener
    并在
    值unbound
    中执行某些操作
  • 在LoginManager中用@PreDestroy注释方法

  • 任何其他建议的方法/最佳实践建议都将不胜感激。

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

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

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

    我不知道为什么你需要“注销”用户,但是你应该能够将你的注销挂在侦听器上

    “保持登录JAAS”可能对您的容器没有多大意义。Jetty没有用户/主体/主题缓存,因此除非您自己实现缓存,否则您不会“保持登录”,正如我们所做的那样

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

    当会话过期时,服务器返回302并重定向到登录页面。页面上的表单submit调用登录模块(可能是JAAS模块),在成功身份验证后创建一个新会话和会话id,该会话和会话id通常通过cookie(或URL重写)发送回浏览器


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

    Servlet规范中有一条语句,大意是会话无效性正好对应于其中没有主体的状态。这是关键。logout()和timeout都会使会话无效,而使会话无效会从会话中删除主体及其所有值绑定

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

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

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


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

    “Core Java Server Faces”p。525表示“目前,在使用容器管理的安全性时,没有关于注销或切换身份的规范。”我还遇到过一些关于J2EE安全性的博客,抱怨无效会话不能很好地替代正式注销,但这些博客比较旧,是在Servlet 3.0之前编写的,这提供了一种以编程方式注销的方法。显然,您的CJSF版本早于Servlet 3.0。我不知道JAAS的核心是什么。我不知道web容器如何与JAAS交互,例如主题、主体和组的存储位置,调用HttpServletRequest#logout()与会话超时时实际发生了什么。如果会话超时,调用HttpServletRequest#logout()时执行的内务处理是否也由容器执行?如果没有,,为什么在这种情况下不需要它呢?在阅读了Servlet 3.0规范、JAAS规范和JEE 6规范之后,我不知道上述问题的答案,我希望有人能向我指出文档或开发列表线程,甚至JBoss/Tomcat/Jetty/Glassfish设计文档或显示发生了什么的源代码片段在会话超时时创建Subject、Principal和Group实例。如果知道调用HttpServletRequest#logout()时这些对象会发生什么情况,那就太好了。在这两种情况下,如何处理注销之间的差异(如果有的话)将是巨大的。+1对于一个简洁(正确)的答案=)从这篇文章中删除了许多攻击性的评论,使得一些(删除的)答案语调不连贯。一切都好,结局都好。谢谢@EJP。有趣的是,如果在调用request.logout()之后设置断点,我可以看到会话没有失效,尽管主体已从会话中删除