会话过期后如何重定向到登录页面?

2024-05-10

我有三个 JSF 2.0 Web 模块,当会话过期时我需要重定向到登录页面。

我已经尝试过使用HttpSessionListener,它正在调用sessionDestroyed()事件方法,但我无法在那里转发/重定向请求。我认为这是因为没有HttpServletRequest and HttpServletResponse对象。

我也尝试过使用PhaseListener,但它会导致网络浏览器中出现“重定向过多”错误。

public class SessionListener implements PhaseListener {

    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

    public void beforePhase(PhaseEvent event) {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            try {
                System.out.println("Session Destroyed");
                FacesContext.getCurrentInstance().getExternalContext().redirect("login.jsf");
            }
            catch (Exception e) {
                System.out.println("error" + e);
            }
        }
    }

    public void afterPhase(PhaseEvent event)  {
        try {
            System.out.println("Session Created");
        }
        catch (Exception e) {
            System.out.println("error" + e);
        }
    }

}

为什么这些尝试不起作用?我怎样才能最好地解决它?


It's not可以在会话过期的同时发送重定向。也就是说,客户端此时尚未发送任何 HTTP 请求,您可以通过重定向进行响应。

您应该保留现有的身份验证机制,当用户不再登录时,该机制会重定向到登录页面。您最多可以通过添加检查用户是否被重定向到登录页面来改进它because会话已过期,或者只是因为他以前从未登录过(即,这是一个全新的请求)。

你可以通过 if 来检查HttpServletRequest#getRequestedSessionId() http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getRequestedSessionId%28%29不回来null(这意味着客户端已发送会话 cookie,因此假设会话仍然有效)并且HttpServletRequest#isRequestedSessionIdValid() http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#isRequestedSessionIdValid%28%29回报false(这意味着会话在服务器端已经过期)。您可以在检查登录用户的同一过滤器中执行此操作(您已经有一个,对吧?或者您正在使用容器管理的身份验证?)。

User user = (User) session.getAttribute("user");

if (user == null) {
    String loginURL = request.getContextPath() + "/login.jsf";
    if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
        response.sendRedirect(loginURL + "?expired=true");
    } else {
        response.sendRedirect(loginURL);
    }
} else {
    chain.doFilter(request, response);
}

然后在login.xhtml页面检查它

<h:panelGroup rendered="#{param.expired}">
    <p>You have been redirected to the login page, because your session was expired.</p>
</h:panelGroup>

顺便说一句,你的相位监听器方法毫无意义。它确实发送了一个重定向每一个请求导致其无限循环运行。恢复视图阶段与会话过期完全无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

会话过期后如何重定向到登录页面? 的相关文章

随机推荐