每个用户在访问完网站后,经常会忽略注销账户,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自动注销的更多相关文章

  1. java用while循环设计轮询线程的性能问题

    java用while循环设计轮询线程的性能问题 轮询线程在开发过程中的应用是比较广泛的,在这我模拟一个场景,有一个队列和轮询线程,主线程往队列中入队消息,轮询线程循环从队列中读取消息并打印消息内容.有 ...

  2. WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)

    上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...

  3. Ajax轮询消息自动提示(消息盒子)

    经过一下午写了个消息盒子的例子,用的是ajax方式轮询读取,没有用到后台自动“推”数据的方式,效果良好. <%@ Page Language="C#" AutoEventWi ...

  4. Postman实现数字签名,Session依赖, 接口依赖, 异步接口结果轮询

    Script(JS)为Postman赋予无限可能 基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现 PS 最近接到任务, 要把几种基本下单接口调试和持续集 ...

  5. 使用Azure Functions 在web 应用中启用自动更新(一)分析基于轮询的 Web 应用的限制

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  6. 基于springboot实现轮询线程自动执行任务

    本文使用: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时 ...

  7. nginx负载均衡 加权轮询和ip_hash

    下面给大家总结了几种真正的nginx负载均衡的功能了,在此我们加了一个权重判断法就是根据nginx负载的状态实现分配访问用户到权重值少的机器了,具体配置如下. nginx为后端web服务器(apach ...

  8. Nginx中的upstream轮询机制介绍

    Nginx中upstream有以下几种方式: 1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器d ...

  9. 支持阻塞操作和轮询操作的globalfifo设备驱动代码分析以及测试代码

    #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include ...

随机推荐

  1. ELK对Tomcat日志双管齐下-告警触发/Kibana日志展示

    今天我们来聊一聊Tomcat,相信大家并不陌生,tomcat是一个免费开源的web应用服务器,属于轻量级的应用程序,在小型生产环境和并发不是很高的场景下被普遍使用,同时也是开发测试JSP程序的首选.也 ...

  2. day14.生成器进阶,推导式

    生成器中取值的三种方法 方法1:next() 方法2:for 循环 方法3:数据类型的强制转换 def func(): for i in range(20): yield '赛车*{}'.format ...

  3. CSS 实现左侧固定,右侧自适应两栏布局的方法

    "左边固定,右边自适应的两栏布局",其中有老生常谈的float方法,BFC方法,也有CSS3的flex布局与grid布局.并非所有的布局都会在开发中使用,但是其中也会涉及一些知识点 ...

  4. ExpandableListView

    ExpandableListView 1.界面 Item_Group_layout 就一个TextView <?xml version="1.0" encoding=&quo ...

  5. 马昕璐201771010118《面向对象程序设计(java)》第七周学习总结

    第一部分:理论知识学习部分 Java用于控制可见性的4个访问权限修饰符: 1.private(只有该类可以访问) 2.protected(该类及其子类的成员可以访问,同一个包中的类也可访问) 3.pu ...

  6. 关于eclipse的Progress一直跳转的解决方案

    下载eclipse编程,发现了一个问题:执行main方法第二次console打印不出数据,后发现Progress一直跳转,而且非常多进度条在运行,关闭后第一次执行没问题,第二次问题重复出现. 有幸看到 ...

  7. Nginx 自定义404、500、502 页面

    利用nginx的反向代理来实现 服务器404 和500 等状态码的自定义页面 1.nginx配置文件 nginx.conf 配置开启代理错误拦截 和配置页面  下划线部分  http { ...... ...

  8. python全栈开发 * 表格标签 表单标签 css 引入方式 * 180807

    html部分 一.表格标签<table> 1.一个表格<table>由每行<tr>组成的,每行是由<td>组成的. 注意: 一个表格是由行组成的(行是由 ...

  9. iOS—使用picker View

    iOS—使用picker View 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162,不可修改. 2.显示数据,需要设置 ...

  10. lua 操作redis

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在red ...