我有一个JSF应用程序,并希望用户在一段时间不活动后自动注销。有没有标准的方法来做到这一点?
答案 0 :(得分:4)
通常,托管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() {
}
}