我正在尝试为我的应用程序配置会话超时。
在web.xml中我配置了1分钟,像这样:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
为了确保一切正常,我创建了一个监听器,参见:
<listener>
<listener-class>br.com.sender.util.SessionListener</listener-class>
</listener>
查看我的listener类:
package br.com.sender.util;
import java.util.Date;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
}
}
当我登录在我的应用程序会话被创建(在同一时刻,我存储一个UserMB与sessionScope),见:
Session ID 801040FAFEBC8D21C3C8E0DA56BF9B27 created at Tue Jun 10 18:44:33 BRT 2014
几分钟后,会话将被销毁:
Session ID 801040FAFEBC8D21C3C8E0DA56BF9B27 destroyed at Tue Jun 10 18:46:26 BRT 2014
当用户单击某些菜单或按钮时,会话再次创建,但我希望UserMB (SessionScope)被分发,用户必须再次登录,但它没有发生,用户继续使用应用程序而不重新登录。
您需要一个WebFilter
来检查会话范围中的某些属性并确定用户是否登录
这完全取决于您如何配置您没有在问题中发布的security
。
如果您没有通过java ee web.xml
安全设置或通过filter
检查验证您的登录用户,那么您的页面不安全,当用户点击下一个URL时,session
将被重新创建。
如果您没有使用容器安全或java ee安全,那么您可以使用某种过滤器来检查除登录之外的所有页面
@WebFilter("/*")
public class LoginFilter implements Filter {
private ServletContext context;
public void init(FilterConfig fConfig) throws ServletException {
this.context = fConfig.getServletContext();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String requestURL = ((HttpServletRequest)request).getRequestURL().toString();
HttpSession session = req.getSession(false);
if(session == null && !(requestURL.endsWith("login.xhtml"))){
((HttpServletResponse)response).sendRedirect("login.xhtml");
}else{
chain.doFilter(request, response);
}
}
}
您可能在应用程序中编写了一些servlet或过滤器,拦截所有请求,然后将其转发给右控制器进行请求处理,因此在servlet/过滤器中,您必须检查session.getAttribute("someinfo") != null,如果为空,则将请求转发到登录页面