Java 在HttpSessionListener中如何获取HttpServletRequest?

Java 在HttpSessionListener中如何获取HttpServletRequest?,java,session,jsf,jakarta-ee,request,Java,Session,Jsf,Jakarta Ee,Request,如何从SessionListener访问请求头 我需要在当前会话创建时设置一个超时。超时需要根据HttpServletRequest中的标头而变化。我已经有了一个SessionListener(实现了HttpSessionListener),它记录了新会话的创建和销毁,而且它似乎是设置超时的最合理的地方 我尝试了以下方法,但它总是将ctx设置为null FacesContext ctx = FacesContext.getCurrentInstance(); 你看不见。请求允许您访问会话,但不

如何从SessionListener访问请求头

我需要在当前会话创建时设置一个超时。超时需要根据HttpServletRequest中的标头而变化。我已经有了一个SessionListener(实现了HttpSessionListener),它记录了新会话的创建和销毁,而且它似乎是设置超时的最合理的地方

我尝试了以下方法,但它总是将ctx设置为null

FacesContext ctx = FacesContext.getCurrentInstance();
你看不见。请求允许您访问会话,但不能通过其他方式访问会话


您甚至可能对同一会话有并发请求,因此这是不可行的。

HttpSessionListener无法访问该请求,因为它是在没有请求通知会话破坏时调用的

因此,
过滤器
Servlet
将是检查请求和指定会话超时的更好地方

FacesContext ctx = FacesContext.getCurrentInstance();
JSF上下文是每个请求和线程本地的。因此,这个方法调用可能会在JSF控制器调用之外返回null(例如,其他线程和任何未通过Faces servlet映射的请求)

从技术上讲,使用JSF机制设置此超时是可能的——您可以在之后使用检查会话,尽管您仍然需要设置超时。阶段监听器的优点是,它们可以在faces config()中全局注册,也可以在faces config()中全局注册。使用META-INF/faces-config.xml在JAR中定义的全局阶段侦听器可以放入多个WAR中,从而允许您轻松地重用该功能

(您也可以,但工作量过大。)


对于一次性的,使用a是非常简单的。

“您甚至可能对同一个会话有并发请求,因此这是不可行的。”我不同意!只有一个请求将导致为其创建“sessionCreated”的会话。这是规范中的一个疏忽。。。对于“sessionCreated”方法,您应该能够找到创建会话的请求!