我正在使用ServletRequestListener
附加新请求,获取ServletRequest
个对象并从中提取Cookie。
我注意到只有HTTPServletRequest
有Cookie,但我没有在这两个对象之间找到连接。
可以使用
HttpServletRequest request = ((HttpServletRequest) FacesContext.getCurrentInstance()
.getExternalContext().getRequest());
在RequestInitialized
方法中检索请求? (我确实想在每个请求上运行)
仅供参考 - 这都是在JSF 1.2应用程序中完成的
答案 0 :(得分:5)
这不正确。 FacesContext
本身不具备getCurrentInstance()
。 null
可能会返回ServletRequest
,导致NPE。
如果您在HTTP网络服务器上运行webapp(例如,而不是某些Portlet网络服务器),您可以将HttpServletRequest
转换为public void requestInitialized(ServletRequestEvent event) {
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
// ...
}
。
*.jsf
请注意,更常见的做法是使用ServletRequestListener
,因为您可以将其映射到固定的URL模式(如FacesServlet
)或甚至特定的servlet上,以便它仅在{{{ 1}}跑。例如,您可能希望跳过对CSS / JS / images等静态资源的cookie检查。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
// ...
chain.doFilter(req, res);
}
当您恰好已经在JSF上下文中(在托管bean,phaselistener或其他任何内容中)时,您可以使用Filter
来获取cookie。
Map<String, Object> cookies = externalContext.getRequestCookieMap();
// ...
在Servlet API之上运行JSF时,地图值的类型为ExternalContext#getRequestCookieMap()
。
Cookie cookie = (Cookie) cookies.get("name");
答案 1 :(得分:0)
是的,你可以这样做。在Web方案中,这总是可以的。如果您想确定,可以先检查类型。 (无论如何都是好的做法):
if (FacesContext.getCurrentInstance().getExternalContext().getRequest() instanceof HttpServletRequest) {
...
顺便说一下:你为什么要使用FacesContext
?你从哪里调用这段代码?