如何在过滤器中访问Application或ViewHandler

时间:2013-09-07 01:59:52

标签: jsf servlet-filters

在过滤器中使用身份验证并手动重定向到登录网站我需要访问ApplicationViewHandler以使用ViewHandler.getBookmarkableURL(...)创建可收藏的网址。

这是必要的,因为我的view-id正在使用第三方框架重写为clean-urls。

1 个答案:

答案 0 :(得分:1)

使用标准servlet API是不可能的,所以你真的需要手动创建FacesContext,或者如果它是第三方URL重写框架,如果他们还没有提供任何API,请查看其文档为了这个目的。

您可以根据FacesContextrequest手动创建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的方法,请务必使用它。