我一直在看這個主題的很多帖子,但無法得到一個解決方案,在我的情況。HttpSession超時後重定向
我使用的Java EE 6的JSF 2.0(部署在JBoss AS 7.1)
在我web.xml
我:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
和我希望用戶被重定向到登錄頁面當會話自動超時。
我曾嘗試:
方法1:使用過濾器
我曾嘗試以下過濾器:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
在web.xml
我試圖
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
和
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
該過濾器在每次請求時調用(在控制檯中記錄「fiter called」)。 但會話超時時不會調用它。
方法2:HttpSessionLister
我曾嘗試使用HttpSessionListerner
。該方法稱爲具有以下簽名:
public void sessionDestroyed(HttpSessionEvent se) {
}
我無法重定向到特定頁面。當我想重定向用戶時,我通常使用FacesContext
中的NavigationHandler
,但在這種情況下不存在FacesContext
(FacesContext.getCurrentInstance()
返回null
)。
根據此post,HttpListener不能重定向用戶,因爲它不是請求的一部分。
問題
什麼是去解決這個問題的最好方法是什麼?我能做些什麼來使上述兩種方法中的一種起作用?
相關:http://stackoverflow.com/q/ 4992526/1065197 – 2013-03-22 14:50:48
@LuiggiMendoza:非常感謝。雖然我從來沒有見過'ViewExpiredException',並且我希望(如果可能)重定向到登錄頁面,而用戶不必點擊任何東西。 – phoenix7360 2013-03-22 14:55:39
您需要在客戶端進行某種形式的輪詢以觸發服務器端的302。一個心跳... – 2013-03-22 14:56:44