如何从 SessionListener 访问请求标头?
我需要在创建当前会话时为其设置超时。超时需要根据 HttpServletRequest 中的标头而有所不同。我已经有一个 SessionListener(实现 HttpSessionListener)记录新会话的创建和销毁,它似乎是设置超时的最合乎逻辑的地方。
我尝试了以下方法,但它总是将 ctx 设置为 null。
FacesContext ctx = FacesContext.getCurrentInstance();
如何从 SessionListener 访问请求标头?
我需要在创建当前会话时为其设置超时。超时需要根据 HttpServletRequest 中的标头而有所不同。我已经有一个 SessionListener(实现 HttpSessionListener)记录新会话的创建和销毁,它似乎是设置超时的最合乎逻辑的地方。
我尝试了以下方法,但它总是将 ctx 设置为 null。
FacesContext ctx = FacesContext.getCurrentInstance();
HttpSessionListener
无权访问该请求,因为它是在没有发出请求时调用的——通知会话销毁。
因此,a Filter
orServlet
会是更好的地方来检查请求并指定会话超时。
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.
你不能(见API)。该请求允许您访问会话,但不能反过来。
您甚至可能对同一会话有并发请求,因此这是不可行的。