2011-03-24 61 views
4

我使用ServletRequestListener附加到新请求,获取ServletRequest对象并从中提取cookie。从ServletRequest获取Cookie

我注意到只有HTTPServletRequest有cookie,但我还没有找到这两个对象之间的连接。

它是怎么运用

HttpServletRequest request = ((HttpServletRequest) FacesContext.getCurrentInstance() 
       .getExternalContext().getRequest()); 

检索请求,而在RequestInitialized方法? (我想在每次请求运行)

仅供参考 - 这是所有在JSF 1.2应用

回答

5

这是不正确的。 FacesContext不适用于ServletRequestListener本身。 getCurrentInstance()可能会返回null,导致NPE的。

如果您在HTTP Web服务器上运行Web应用程序(并且因此不是某个Portlet网络服务器),您可以将ServletRequest转换为HttpServletRequest

public void requestInitialized(ServletRequestEvent event) { 
    HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); 
    // ... 
} 

需要注意的是一个比较普遍的做法是使用Filter对于这一点,因为你可以在特定的servlet在一个固定的URL模式映射这个喜欢*.jsf,甚至使其运行FacesServlet只运行时。例如,您可能想要跳过静态资源(如CSS/JS /图像)上的Cookie检查。

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { 
    HttpServletRequest request = (HttpServletRequest) req; 
    // ... 
    chain.doFilter(req, res); 
} 

当你恰好是已经JSF上下文内(在一个托管bean,PhaseListener在或其他),你可以只使用ExternalContext#getRequestCookieMap()拿到饼干。

Map<String, Object> cookies = externalContext.getRequestCookieMap(); 
// ... 

当运行上的Servlet API之上JSF,地图值是javax.servlet.http.Cookie类型。

Cookie cookie = (Cookie) cookies.get("name"); 
0

是做,你能做到这一点。在Web场景中,这总是可以的。如果你想确定,你可以先检查一下这个类型。 (良好做法反正):

if (FacesContext.getCurrentInstance().getExternalContext().getRequest() instanceof HttpServletRequest) { 
... 

顺便说一句:你为​​什么要使用FacesContext?你从哪里调用这个代码?

+0

我不需要。有另一种方法吗?我正在使用它,因为我在JSF应用程序中。 – Ben 2011-03-24 10:26:46

+0

对不起,我想,我忽略了那部分。你的意思是Application在'javax.faces.application.Application'中吗?在这种情况下,你没有选择。 – nfechner 2011-03-24 10:33:05