我有三个 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(使用前将#替换为@)