4

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

@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");
    }

}

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

4

2 回答 2

3

只需告诉浏览器不要缓存登录页面。将响应转换为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.

否则,浏览器会在后退按钮上从缓存中提供页面,而不是发送应该触发过滤器的服务器的完整请求。

于 2013-01-11T13:08:58.207 回答
0

在我看来,使用 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;
}

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

于 2018-11-05T17:41:36.937 回答