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

Session 会话过期时如何重定向到登录页面?,session,servlets,jsf-2,Session,Servlets,Jsf 2,我有三个JSF2.0Web模块,当会话到期时,我需要重定向到登录页面 我使用了一个HttpSessionListener,它正在调用sessionDestroyed()事件方法,但是我无法转发/重定向其中的请求。我认为这是因为没有HttpServletRequest和HttpServletResponse对象 我还尝试了使用PhaseListener,但这会导致webbrowser中出现“太多重定向”错误 public class SessionListener implements Phase

我有三个JSF2.0Web模块,当会话到期时,我需要重定向到登录页面

我使用了一个
HttpSessionListener
,它正在调用
sessionDestroyed()
事件方法,但是我无法转发/重定向其中的请求。我认为这是因为没有
HttpServletRequest
HttpServletResponse
对象

我还尝试了使用
PhaseListener
,但这会导致webbrowser中出现“太多重定向”错误

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

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

尝试使用

 FacesContext.getCurrentInstance().getApplication().getNavigationHandler().
       handleNavigation(context, null, "LoginForm");
但请注意,出于这些目的,您应该使用Servlet过滤器,最好不要从PhaseListener进行任何重定向,因为它很容易出错。

尝试使用

 FacesContext.getCurrentInstance().getApplication().getNavigationHandler().
       handleNavigation(context, null, "LoginForm");

但是请注意,出于这些目的,您应该使用Servlet过滤器,最好不要从PhaseListener进行任何重定向,因为它确实很容易出错。

不可能在会话到期时发送重定向。也就是说,客户机当时没有发送任何HTTP请求,您可以通过重定向来响应该请求

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

您可以通过if不返回
null
(这意味着客户端已经发送了会话cookie,因此假定会话仍然有效)和返回
false
(这意味着会话在服务器端已过期)来检查这一点。您可以在检查登录用户的同一个过滤器中执行此操作(您已经有了一个,对吗?或者您正在使用容器管理的身份验证?)

然后在
login.xhtml
页面中检查它

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

您已被重定向到登录页面,因为您的会话已过期


你的相位监听器方法毫无意义。它确实会对每个请求发送重定向,从而使其在无限循环中运行。还原视图阶段与会话到期完全无关。

不可能在会话到期时发送重定向。也就是说,客户机当时没有发送任何HTTP请求,您可以通过重定向来响应该请求

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

您可以通过if不返回
null
(这意味着客户端已经发送了会话cookie,因此假定会话仍然有效)和返回
false
(这意味着会话在服务器端已过期)来检查这一点。您可以在检查登录用户的同一个过滤器中执行此操作(您已经有了一个,对吗?或者您正在使用容器管理的身份验证?)

然后在
login.xhtml
页面中检查它

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

您已被重定向到登录页面,因为您的会话已过期


你的相位监听器方法毫无意义。它确实会对每个请求发送重定向,从而使其在无限循环中运行。还原视图阶段与会话过期完全无关。

只有在会话过期(仅因重定向)或之前,您才会收到这些错误?只有在会话过期(仅因重定向)或之前,您才会收到这些错误?