第一步:建立SessionListener
(1)建立SessionListener
该Listener包与mvc层包平行即可
建立SessionListener 集成 http的监听器的接口去
package com.vilicode.Listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// 会话创建时触发
System.out.println("Session Created: " + se.getSession().getId());
System.out.println("session created time:"+se.getSession().getCreationTime());
se.getSession().setMaxInactiveInterval(300);
se.getSession().setAttribute("sessionfiltername","sessiontimeout");
SessionChecker.startSessionTimeoutChecker(se.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 会话销毁时触发
System.out.println("Session Destroyed: " + se.getSession().getId());
}
}
该监听器会在session建立与摧毁是被启用的 session的超时时间的设置 session是一旦服务器启动,就创建server与client的连接的。 se.getSession().setMaxInactiveInterval(300); //只需要设置足够长的会话超时的session时间就OK 这里是300=====五分钟
(2)session的监听器的内容执行者
这一块就是我们的每时每刻在监听session的监听器的内容执行者。
如果没啥需要执行的通知类的代码, 这里没必要写过多代码,也可以不写这一块代码。
package com.vilicode.Listener;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.Enumeration;
import java.util.Timer;
import java.util.TimerTask;
public class SessionChecker {
public static void startSessionTimeoutChecker(HttpSession session) {
TimerTask task = new TimerTask() {
@Override
public void run() {
long date = new Date().getTime();
}
};
Timer timer = new Timer();
timer.schedule(task, 0, 1000); // 每秒检查一次
}
}
第二步:建立session的过滤器
package com.vilicode.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Pattern;
@WebFilter(filterName = "sessionTimeoutFilter", urlPatterns ="/*")
public class SessionTimeoutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String url=httpServletRequest.getRequestURI();
if(url.contains("/index")||url.contains("/user_login.jsp")||url.contains("/user_register.jsp"))
{
chain.doFilter(httpServletRequest, httpServletResponse);
}
HttpSession session = httpServletRequest.getSession(false);//会话不存的话不会创建他的
//session 会在一开始的时候就会自动生成 这是服务器端与客户端建立连接的时候 自动生成 以保护客户的信息与属性
//我们在session创建的时候设置了 一个session的 key与calue属性为“sessionfiltername":"sessiontimeout"
if (session == null || session.getAttribute("sessionfiltername") == null) {
// 会话过期,重定向至登录页面
String str = " <script language='javascript'>alert('会话过期,请重新登录');"
+ "window.top.location.href='user_login.jsp';</script>";
httpServletResponse.setContentType("text/html;charset=UTF-8");
PrintWriter writer=httpServletResponse.getWriter();
writer.write(str);
writer.flush();
} else {
// 会话仍然有效,继续处理请求
chain.doFilter(httpServletRequest, httpServletResponse);
}
}
@Override
public void destroy() {
}
}
上述代码首先需要过滤掉首页与login页面就OK,其余解释看代码就OK。