1
我有一個JSF應用程序,並希望用戶在一段時間不活動後自動註銷。有沒有一個標準的方法來做到這一點?JSF應用程序中的自動註銷
我有一個JSF應用程序,並希望用戶在一段時間不活動後自動註銷。有沒有一個標準的方法來做到這一點?JSF應用程序中的自動註銷
承載Web應用程序的服務器(Tomcat,Glassfish ...)通常會處理會話超時。
例如,在Tomcat中,您可以通過添加在web.xml
文件如下因素行定義一個特定的Web應用程序會話超時:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
這將超時設置爲30分鐘。
當用戶在超過此定義的超時的時間內未發送任何請求時,服務器上的會話將失效。如果用戶在會話失效後嘗試重新連接,他通常會被重定向到另一個頁面或錯誤頁面。
您可以開發自己的JSF篩選器,該篩選器將自動將用戶重定向到timeout.html
頁面。下面是一個這樣的過濾器的例子:
public class TimeoutFilter implements Filter {
private static final String TIMEOUT_PAGE = "timeout.html";
private static final String LOGIN_PAGE = "login.faces";
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
HttpServletRequest requestHttp = (HttpServletRequest) request;
HttpServletResponse responseHttp = (HttpServletResponse) response;
if (checkResource(requestHttp)) {
String requestPath = requestHttp.getRequestURI();
if (checkSession(requestHttp)) {
String timeoutUrl = hRequest.getContextPath() + "/" + TIMEOUT_PAGE;
responseHttp.sendRedirect(timeoutUrl);
return;
}
}
filterChain.doFilter(request, response);
}
private boolean checkResource(HttpServletRequest request) {
String requestPath = request.getRequestURI();
return !(requestPath.contains(TIMEOUT_PAGE) || requestPath.contains(LOGIN_PAGE) || requestPath.equals(hRequest.getContextPath() + "/"));
}
private boolean checkSession(HttpServletRequest request) {
return request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid();
}
public void destroy() {
}
}
這將失敗,當你將第一次訪問不在你的checkResource方法的url。不是嗎?你會不會得到一個會話過期的行爲,即使你只是第一次訪問該頁面? – 0m4r 2013-12-04 14:33:34