2

在过滤器中使用身份验证并手动重定向到登录站点,我需要访问ApplicationViewHandler使用ViewHandler.getBookmarkableURL(...).

这是必要的,因为我的 view-id 正在使用 3rd-party 框架重写为干净的 url。

4

1 回答 1

1

使用标准 servlet API 是不可能的,因此您确实需要手动创建 . FacesContext,或者如果它是一个 3rd 方 URL 重写框架,请检查其文档,如果他们还没有为此目的提供任何 API。

您可以手动创建FacesContext基于requestresponse如下:

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,请务必使用它。

于 2013-09-08T23:58:03.733 回答