在过滤器中使用身份验证并手动重定向到登录站点,我需要访问Application
或ViewHandler
使用ViewHandler.getBookmarkableURL(...)
.
这是必要的,因为我的 view-id 正在使用 3rd-party 框架重写为干净的 url。
在过滤器中使用身份验证并手动重定向到登录站点,我需要访问Application
或ViewHandler
使用ViewHandler.getBookmarkableURL(...)
.
这是必要的,因为我的 view-id 正在使用 3rd-party 框架重写为干净的 url。
使用标准 servlet API 是不可能的,因此您确实需要手动创建 . FacesContext
,或者如果它是一个 3rd 方 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
,请务必使用它。