7

如何从 SessionListener 访问请求标头?

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

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

FacesContext ctx = FacesContext.getCurrentInstance();
4

3 回答 3

10

HttpSessionListener无权访问该请求,因为它是在没有发出请求时调用的——通知会话销毁。

因此,a FilterorServlet会是更好的地方来检查请求并指定会话超时。

于 2009-06-04T23:50:00.350 回答
2
FacesContext ctx = FacesContext.getCurrentInstance();

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

在技​​术上可以使用 JSF 机制设置此超时 - 您可以使用阶段侦听器在RENDER RESPONSE之后检查会话,尽管您仍然必须强制转换为 servlet API来设置超时。相位监听器的优点是它们可以在 faces-config 中全局注册(参见规范)或特定视图使用META-INF/faces-config.xml在 JAR 中定义的全局阶段侦听器可以放入多个 WAR,从而使您可以轻松地重用该功能。

(您也可以覆盖将会话供应给 JSF的方式,但工作量过多。)

For a one-off, erickson's suggestion of a Filter is really straightforward.

于 2009-06-05T10:49:37.770 回答
1

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

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

于 2009-06-04T23:22:41.573 回答