如何从SessionListener访问请求标头?
我需要在创建当前会话时设置超时。超时需要根据HttpServletRequest中的标头而变化。我已经有一个SessionListener(实现HttpSessionListener)来记录新会话的创建和销毁,它似乎是设置超时的最合理的地方。
我尝试了以下内容,但它始终将ctx设置为null。
FacesContext ctx = FacesContext.getCurrentInstance();
答案 0 :(得分:8)
HttpSessionListener
无法访问请求,因为在没有请求时调用它来通知会话销毁。
因此,Filter
或Servlet
可以更好地检查请求并指定会话超时。
答案 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 suggestion的Filter非常简单。
答案 2 :(得分:1)
你不能(见the API)。该请求允许您访问会话,但不是相反。
您甚至可能对同一会话有并发请求,因此这是不可行的。