如何在HttpSessionListener中获取HttpServletRequest?

时间:2009-06-04 23:10:48

标签: java session jsf java-ee request

如何从SessionListener访问请求标头?

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

我尝试了以下内容,但它始终将ctx设置为null。

FacesContext ctx = FacesContext.getCurrentInstance();

3 个答案:

答案 0 :(得分:8)

HttpSessionListener无法访问请求,因为在没有请求时调用它来通知会话销毁。

因此,FilterServlet可以更好地检查请求并指定会话超时。

答案 1 :(得分:2)

FacesContext ctx = FacesContext.getCurrentInstance();

JSF上下文是按请求和线程本地的。因此,此方法调用可能会在JSF控制器调用之外返回null(例如FacesServlet.service) - 因此,其他线程和任何不通过Faces servlet映射的请求。

技术上可以使用JSF机制设置此超时 - 您可以使用phase listener检查RENDER RESPONSE之后的会话,但仍需要cast to the servlet API设置超时。阶段监听器的优点是它们可以在faces-config(see spec)或for specific views中全局注册。在JAR中使用 META-INF / faces-config.xml 定义的全局阶段侦听器可以放入多个WAR中,从而可以轻松地重用该功能。

(你也可以override how the session is provisioned to JSF,但工作量过多。)

对于一次性,erickson's suggestionFilter非常简单。

答案 2 :(得分:1)

你不能(见the API)。该请求允许您访问会话,但不是相反。

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