Session 会话过期时如何重定向到登录页面?
我有三个JSF2.0Web模块,当会话到期时,我需要重定向到登录页面 我使用了一个Session 会话过期时如何重定向到登录页面?,session,servlets,jsf-2,Session,Servlets,Jsf 2,我有三个JSF2.0Web模块,当会话到期时,我需要重定向到登录页面 我使用了一个HttpSessionListener,它正在调用sessionDestroyed()事件方法,但是我无法转发/重定向其中的请求。我认为这是因为没有HttpServletRequest和HttpServletResponse对象 我还尝试了使用PhaseListener,但这会导致webbrowser中出现“太多重定向”错误 public class SessionListener implements Phase
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>
您已被重定向到登录页面,因为您的会话已过期
你的相位监听器方法毫无意义。它确实会对每个请求发送重定向,从而使其在无限循环中运行。还原视图阶段与会话过期完全无关。只有在会话过期(仅因重定向)或之前,您才会收到这些错误?只有在会话过期(仅因重定向)或之前,您才会收到这些错误?