如何通过轮询实现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的代码实现哦!!!!
如何通过轮询实现session自动注销的更多相关文章
- java用while循环设计轮询线程的性能问题
java用while循环设计轮询线程的性能问题 轮询线程在开发过程中的应用是比较广泛的,在这我模拟一个场景,有一个队列和轮询线程,主线程往队列中入队消息,轮询线程循环从队列中读取消息并打印消息内容.有 ...
- WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...
- Ajax轮询消息自动提示(消息盒子)
经过一下午写了个消息盒子的例子,用的是ajax方式轮询读取,没有用到后台自动“推”数据的方式,效果良好. <%@ Page Language="C#" AutoEventWi ...
- Postman实现数字签名,Session依赖, 接口依赖, 异步接口结果轮询
Script(JS)为Postman赋予无限可能 基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现 PS 最近接到任务, 要把几种基本下单接口调试和持续集 ...
- 使用Azure Functions 在web 应用中启用自动更新(一)分析基于轮询的 Web 应用的限制
1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...
- 基于springboot实现轮询线程自动执行任务
本文使用: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时 ...
- nginx负载均衡 加权轮询和ip_hash
下面给大家总结了几种真正的nginx负载均衡的功能了,在此我们加了一个权重判断法就是根据nginx负载的状态实现分配访问用户到权重值少的机器了,具体配置如下. nginx为后端web服务器(apach ...
- Nginx中的upstream轮询机制介绍
Nginx中upstream有以下几种方式: 1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器d ...
- 支持阻塞操作和轮询操作的globalfifo设备驱动代码分析以及测试代码
#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include ...
随机推荐
- 初窥Java之六
一.二维数组 1.动态创建 数组中元素类型[] 数组名 = new 数组中元素类型[]; 例如:int[][] arr = new int[二维数组的长度][一维数组的长度]: Int[][] arr ...
- c#关键字和常用类型表快查
类型 字节 取值范围 说明 bool 1 true/false/null 布尔类型 char 2 0x0000~0xffff Unicode 16 位字符 byte 1 0~255 无符号的 8 位整 ...
- Yii2 验证规则
验证器的使用方法: public function rules() { return [ [['email', 'password'], 'required'], ['password', 'stri ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- 微信公众号_订阅号_微信JS-SDK网页开发
微信JS-SDK( 分享接口很常用 ) 是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包 借助微信高效使用相机.语音.选题.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.支付等 ...
- swust oj 971
统计利用先序遍历创建的二叉树的深度 10000(ms) 10000(kb) 3331 / 8436 利用先序递归遍历算法创建二叉树并计算该二叉树的深度.先序递归遍历建立二叉树的方法为:按照先序递归遍历 ...
- F#周报2019年第16期
新闻 Ionide试验版本 FSharp路线图介绍 Blazor官方预览 .NET Framework 4.8发布 .NET Core 3 Preview 4发布 需要来自FSharp.Data.Sq ...
- new image()
在js中 新建一个new image()对象,image.src图片地址,这个是io读取是异步的,解决方法 image.onload=function(){ }
- linux和shell的学习记录
1.16条常用的命令 .文件的权限修改:(把文件1.txt的归属改为mysql的,然后ll查看) chown mysql:mysql .txt .增加当前用户的x权限,然后ll查看: chomd u+ ...
- JavaScript字符串相关
嘛,开头来个定义好了! 首先它是JavaScript基本数据类型之一.字符串由零或多个16位Unicode字符组成的字符序列,用''或者""表示. 它有一些转义序列,例如\n ...