在过滤器中使用身份验证并手动重定向到登录网站我需要访问Application
或ViewHandler
以使用ViewHandler.getBookmarkableURL(...)
创建可收藏的网址。
这是必要的,因为我的view-id正在使用第三方框架重写为clean-urls。
答案 0 :(得分:1)
使用标准servlet API是不可能的,所以你真的需要手动创建FacesContext
,或者如果它是第三方URL重写框架,如果他们还没有提供任何API,请查看其文档为了这个目的。
您可以根据FacesContext
和request
手动创建response
,如下所示:
public static FacesContext getFacesContext(HttpServletRequest request, HttpServletResponse response) {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
FacesContextFactory facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
facesContext = facesContextFactory.getFacesContext(request.getServletContext(), request, response, lifecycle);
facesContext.setViewRoot(facesContext.getApplication().getViewHandler().createView(facesContext, ""));
FacesContextWrapper.setCurrentInstance(facesContext);
}
return facesContext;
}
private static abstract class FacesContextWrapper extends FacesContext {
protected static void setCurrentInstance(FacesContext facesContext) {
FacesContext.setCurrentInstance(facesContext);
}
}
请注意,这不被视为“最佳做法”。如果没有手动创建FacesContext
的方法,请务必使用它。