每个用户在访问完网站后,经常会忽略注销账户,session默认存在的时间为30分钟,因此如果需要立即关闭session而又不用麻烦用户则可以通过轮询的方法来实现。
以下通过代码的讲解:
xml配置文件
<!--轮询servlet的配置--> <servlet> <description></description> <display-name>PollingServlet</display-name> <servlet-name>PollingServlet</servlet-name> <servlet-class>com.qf.cotroller.PollingServlet</servlet-class> <load-on-startup>1</load-on-startup><!--设置轮询servlet在服务器启动时就加载--> </servlet> <servlet-mapping> <servlet-name>PollingServlet</servlet-name> <url-pattern>/PollingServlet</url-pattern> </servlet-mapping> <!--session监听器的配置--> <listener> <display-name>MyListener</display-name> <listener-class>com.qf.listener.MySessionListener</listener-class> </listener>
轮询servlet的代码实现
public class PollingServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public PollingServlet() { } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override public void init() throws ServletException { // TODO Auto-generated method stub
System.out.println("轮询开始啦!!!"); //创建定时器对象 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { //从Context全局对象中获取存储session集合的全局变量map Map<String , HttpSession> map = (Map<String , HttpSession>)getServletContext().getAttribute("map"); if(map!=null){//非空则执行以下操作 Set<Entry<String,HttpSession>> set = map.entrySet(); for (Entry<String, HttpSession> entry : set) {//遍历集合中每个session long curDate = new Date().getTime(); long lastTime = entry.getValue().getLastAccessedTime(); if((curDate - lastTime)/1000 > 10){//当session没有操作的时间超过10秒则销毁 entry.getValue().invalidate(); map.remove(entry.getKey()); } } } } }, 0, 1000);//每一秒查询一次sessionmap } }
public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent evt1) { System.out.println("session创建了!!!"); HttpSession session = evt1.getSession(); //获取session //获取用于存储session的全局变量map Map<String , HttpSession> map = (Map<String , HttpSession>)session.getServletContext().getAttribute("map"); if(map == null){//如果第一次存则创建一个map map = new HashMap<String, HttpSession>(); } map.put(session.getId(), session);//将session存入map中 session.getServletContext().setAttribute("map", map); } @Override public void sessionDestroyed(HttpSessionEvent evt1) { System.out.println("session销毁了!!!"); } }
以上为通过轮询销毁session的代码实现哦!!!!
原文:https://www.cnblogs.com/yankuan2016/p/10725922.html