• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
天才少女燕与丑宽宽
博客园    首页    新随笔    联系   管理    订阅  订阅

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

通过轮询的方式销毁session

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

posted @ 2019-04-17 20:22  天才少女燕与丑宽宽  阅读(206)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3