Jsf 2 JSF2.0重定向主页(如果已记录)

Jsf 2 JSF2.0重定向主页(如果已记录),jsf-2,navigation,Jsf 2,Navigation,如果用户已经登录,如何将用户重定向到主页。我对登录页面使用了过滤器类,但它不能正常工作。我的代码是: @WebFilter(filterName = "loginFilter", urlPatterns ={"/login.xhtml"}) public class LoginFilter implements Filter{ private FilterConfig filterconfig; @Override public void init(FilterConf

如果用户已经登录,如何将用户重定向到主页。我对登录页面使用了过滤器类,但它不能正常工作。我的代码是:

@WebFilter(filterName = "loginFilter",
urlPatterns ={"/login.xhtml"})
public class LoginFilter implements Filter{

    private FilterConfig filterconfig;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterconfig = filterconfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httprequest =(HttpServletRequest) request;
        HttpServletResponse httpresponse =(HttpServletResponse) response;
        try{
        if(httprequest.getUserPrincipal() != null){

            System.out.printf("User authenticated with " + httprequest.getRemoteUser() + " username conected.");
            httprequest.getRequestDispatcher("/home.xhtml").forward(request, response);
        } else{
            chain.doFilter(request, response);
        }
        }catch(Exception){
            //do something
        }

    }

    @Override
    public void destroy() {
        System.out.print("Existing from loginFilter");
    }

}
这是我的问题:用户登录到web并执行一些导航和操作,然后使用浏览器的“后退”按钮返回登录页面,而不注销,然后再次输入用户名密码,然后按“登录”按钮。然后它抛出异常
IndexOutofBoundsException。我只需要检查用户何时使用链接或浏览器的后退按钮导航到登录页面,并重定向到主页。有什么建议吗

告诉浏览器不要缓存登录页面。在对
httpresponse
强制转换响应后,直接将以下行添加到筛选器中

httpresponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpresponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpresponse.setDateHeader("Expires", 0); // Proxies.

否则,浏览器会给出“从缓存返回页面”按钮,而不是发送服务器的完整请求,这将触发筛选器。

我认为,使用BalusC的提示比使用筛选器更好:

<f:view>
    <f:metadata>
        <f:viewAction action="#{login.checkLogin()}"/>
    </f:metadata>

     ...
</f:view>

public String checkLogin() {
    if (getRequest().getRemoteUser() != null) {
        getResponse().setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        getResponse().setHeader("Pragma", "no-cache"); // HTTP 1.0.
        getResponse().setDateHeader("Expires", 0); // Proxies.
        return "Home";
    }

    return null;
}

...
公共字符串checkLogin(){
如果(getRequest().getRemoteUser()!=null){
getResponse().setHeader(“缓存控制”,“无缓存,无存储,必须重新验证”);//HTTP 1.1。
getResponse().setHeader(“Pragma”,“无缓存”);//HTTP 1.0。
getResponse().setDateHeader(“Expires”,0);//代理。
返回“家”;
}
返回null;
}

我认为你不应该像那样破坏过滤器链接,在这个链接中可能还有另一个你不知道的重要过滤器。

你使用的是faces导航规则还是Spring security登录?不允许导航。如果仍然尝试导航,只需注销是的,我使用的是faces导航规则。当用户单击浏览器的“后退”按钮时,就会发生这种情况。谢谢,我添加了另一个过滤器类,包括这些标题数据。我将urlpattern设置为“/*”,因此它适用于所有页面。我认为它应该能正常工作。
/*
过于泛化了。请记住跳过CSS/JS/image资源,否则webapp的性能将受到很大影响。另见