2009-06-04 88 views
6

如何从SessionListener访问请求标头?如何在HttpSessionListener中获取HttpServletRequest?

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

我试过以下,但它总是将ctx设置为null。

FacesContext ctx = FacesContext.getCurrentInstance(); 

回答

8

HttpSessionListener无权访问该请求,因为在未请求任何请求时调用该请求—以通知会话销毁。

因此,一个FilterServlet将是更好的地方来检查请求并指定会话超时。

1

您不能(请参阅the API)。请求允许您访问会话,但不能以其他方式访问。

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

+3

“您甚至可能会对同一个会话发出并发请求,所以这不可行。”我不同意!只有一个请求会导致会话被创建为“sessionCreated”被触发。这是规范中的一个疏忽......对于“sessionCreated”方法,您应该能够找出哪个请求创建了会话! – 2013-08-13 10:00:57

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

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

这在技术上是可以设置此超时使用JSF的机制 - 你可以使用一个phase listenerRENDER RESPONSE后检查会话,但你仍然要cast to the servlet API设置超时。相位侦听器的优点是可以在faces-config(see spec)或for specific views中进行全局注册。在JAR中定义的全局阶段监听器可以放置到多个WAR中,以便您轻松地重用该功能。

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

对于一次性的,一个Filtererickson's suggestion是真的简单。

相关问题