Tomcat会开启一个后台线程每隔一段时间检查Session的有效性,这个线程是在Tomcat启动的时候当StardardEngine启动时随之启动的。可以参看StardardEngine的基类ContainerBase的#threadStart()方法:
protected void threadStart() {
if (thread != null)
return;
if (backgroundProcessorDelay <= 0)
return;
threadDone = false;
String threadName = "ContainerBackgroundProcessor[" + toString() + "]";
// 开启后台的监控线程
thread = new Thread(new ContainerBackgroundProcessor(), threadName);
thread.setDaemon(true);
thread.start();
}
这个方法启动了一个ContainerBackgroundProcessor类的线程,这个类重写的#run()方法中包括了对Session的有效性监控。具体的细节就不详细陈述了。每隔一段时间,此线程就会启动一次并调用了ManageBase的#backgroundProcess()方法。其源代码如下:
public void backgroundProcess() {
count = (count + 1) % processExpiresFrequency;
if (count == 0)
processExpires();
}
每隔一段时间就会调用processExpires()方法去判断Session的有效性。
public void processExpires() {
// 现在的时间
long timeNow = System.currentTimeMillis();
// 所有的Session对象
Session sessions[] = findSessions();
int expireHere = 0;
if (log.isDebugEnabled())
log.debug("Start expire sessions " + getName() + " at " + timeNow + " sessioncount "
+ sessions.length);
for (int i = 0; i < sessions.length; i++) {
// 判断并设定Session是否失效
if (sessions[i] != null && !sessions[i].isValid()) {
expireHere++;
}
}
long timeEnd = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug("End expire sessions " + getName() + " processingTime " + (timeEnd - timeNow)
+ " expired sessions: " + expireHere);
processingTime += (timeEnd - timeNow);
}
此方法最终调用了isValid()去判断和设定Session是否失效,源代码如下所示:
public boolean isValid() {
// 是否过期
if (this.expiring) {
return true;
}
// 是否有效
if (!this.isValid) {
return false;
}
// 正在使用中并且访问数大于0
if (ACTIVITY_CHECK && accessCount.get() > 0) {
return true;
}
if (maxInactiveInterval >= 0) {
// 判断Session是否过期
long timeNow = System.currentTimeMillis();
int timeIdle = (int) ((timeNow - thisAccessedTime) / 1000L);
if (timeIdle >= maxInactiveInterval) {
// 设定Session过期
expire(true);
}
}
return (this.isValid);
}
分享到:
相关推荐
|-------|--ListNews.jsp 后台管理新闻列表页面 |-------|--Logout.jsp 退出系统页面 |-------|--Modifynews.jsp 修改新闻 |-------|--Person.jsp 管理员个人信息页面 |-------|--Session.jsp 是否登录判断遄 |-----...
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不
一同事求援:后台系统的登录成功了,但不能成功登进系统,仍然跳转到登录页,但同一套代码另一个环境却没有问题。 背景 经了解,他对同一个项目使用tomcat部署了两个环境,一个在开发服务器上,一个在他本机,两个...
此后台管理系统采用了SSH框架,前端采用Struts2的S标签进行表单提交,采用JS进行简单的输入验证。后台与mysql数据库进行连接,dao-service-action都是一一对应,便于理解。此后台管理系统,一共有三个表,用户注册表...
(2)打开tomcat/conf/web.xml文件 ,找到 <session-timeout>30</session-timeout> 一行, 把30改成 1-5的数(作用设置是session超时时间,用于扑捉用户直接关闭浏览器时的下 线状态) 完成以上两步后打开tomcat即可在...
基于jsp+js+servlet+jdbc+mysql开发产品后台管理系统,实现用户增删改查、分页,登录,注册,图片上传等功能。 包括以下5个功能: 1、登录 用户默认主页index.jsp,可选择【登录】功能,若登录成功,则进入产品管理中...
tomcat9.0 mysql8.0 win10 推荐使用chrome浏览器 2、开发语言 a、 Java(JDBC部分采用druid连接池,连接池登录名admin,密码123456) b、JavaScript c、 标记语言HTML5、CSS d、 引用模板bootstrap、LayUI、...
JAVA餐厅点餐管理系统源码带前后台 注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再拍。 开发语言 : JAVA 数据库 : MySQL 开发工具 : Eclipse 源码类型 : WebForm 运行环境:jdk7+tomcat8+mysql+...
springboot+mybatis+bootstrap开发员工OA后台管理系统 项目描述 jboa项目有请假以及报销单的申请和审核session共享加登陆拦截人事对人员的管理 员工添加报销单提交到(本部门)部门经理,部门经理通过如果总金额...
3.session管理:使用shiro默认的session管理替代Tomcat的HttpSession; 4.shiro拦截器:对静态文件(HTML/JS/CSS等)进行权限控制,无权限则请求不到; 5.后台接口权限控制:对后台接口启用权限控制,对应的接口若...
通用用户管理系统, 实现最常用的用户注册、登录、资料管理、个人中心、第三方登录等基本需求,支持扩展二次开发。 > zheng-wechat-mp 微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理...
Java用来处理具体业务逻辑,后台跳转、对数据库操作,实现对数据库的增、删、改等操作。 JavaScript用于异步刷新页面和跳转页面。 本次高校宿舍管理系统能够满足用户的基本需求,方便快捷,既节省了时间,提高了...
使用shiro作为安全管理框架,通过其内置session实现安全登录,使用shiro注解完成权限管理。 算法端 使用Bag of Words + CNN完成票据分类,根据分类结果查询并获取相应的发票模板。 使用SIFT特征匹配和配准思路完成...
第3章-秒杀功能开发及管理后台 学习到了基础的商品下单流程, 查库存,查是否重复下单,减库存,创建订单等过程 知识点 数据库设计(业务第一原则, 无需太注意三大范式) 完成商品列表页 完成商品详情页 完成订单详情页 ...
Eclipse、Tomcat、MySQL 技术实现:Spring+SpringMVC+Mybatis+jQuery+Ajax+Highcharts+Bootstrap4 项目描述:模拟预约教练功能,会员通过该系统实现注册、登录、浏览教练信息、预约教练、生成订单、课后确认等功能,...
(3)管理员后台登录; (4)摆设管理[摆设展示,摆设添加,摆设修改,摆设删除]; (5)首页展示摆设[分页] (6)首页搜索; (7)用户退出; (8)购物车管理[展示,添加,修改,删除,清空]; (9)订单管理[结账,查看订单,订单...
样才能真正实现后台多个Tomcat负载平衡,用户请求能够发往任何一个tomcat主机。 keeplived、zabbix与ansible暂不在本文章的范围当中,会在之后的文章逐一进行讲解 实验架构图 部署环境 CentOS7 Nginx1.10.2 ...