首页 > 其他 > 详细

如何通过轮询实现session自动注销

时间:2019-04-17 20:44:21      阅读:252      评论:0      收藏:0      [点我收藏+]

每个用户在访问完网站后,经常会忽略注销账户,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的代码实现哦!!!!

如何通过轮询实现session自动注销

原文:https://www.cnblogs.com/yankuan2016/p/10725922.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!