`
zddava
  • 浏览: 240333 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Tomcat的Session管理(二) - Session后台处理

阅读更多
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);
	}
分享到:
评论
7 楼 u010323779 2015-04-19  
哈哈,非常不错,昨天看了一天源代码,不知从何入手,现在看来您的解释我有点了解了,谢谢哈
6 楼 liuxuejin 2011-03-26  
过期的session是等JVM来回收的?
5 楼 liuxuejin 2011-03-26  
我没有仔细看我的错,是不是session是不会销毁的,tomcat不会去真的去销毁session,只是判断有没有效?
4 楼 liuxuejin 2011-03-26  
lz.session是如何销毁的呢??
3 楼 charseller 2009-05-13  
确实很有帮助。

对于createSession中

# if (sessionId == null) { 
#         sessionId = generateSessionId(); 
#     } 
# session.setId(sessionId);

当用户第一次请求中就包含JSESSIONID,都会按照用户意愿创建。这情况应该有安全问题吧。

在我们的环境中就出现了这种现象。

说用的session管理没啥特别,一切如常。但发现手机端发来的JSESSSIONID值全部由大写被改成了小写!造成以前保存变量取不到,但从被改的交互后正确。

不过,如此session id机制,到是为我们workround创造了条件。

至于为啥JSESSSIONID值全部由大写被改成了小写,还在调查中,比较怀疑wap网关,苦于空中接口log没法取,郁闷ing
2 楼 zddava 2009-02-27  
friskytony 写道

分析的很有参考意义,我也最近在看tomcat6的代码,希望有机会多多交流


一起学习吧,我也是闲的时候看看的,了解的并不是非常深入。

MSN: zddsp1@hotmail.com
1 楼 friskytony 2009-02-25  
分析的很有参考意义,我也最近在看tomcat6的代码,希望有机会多多交流

相关推荐

    梦想新闻发布系统-正式版

    |-------|--ListNews.jsp 后台管理新闻列表页面 |-------|--Logout.jsp 退出系统页面 |-------|--Modifynews.jsp 修改新闻 |-------|--Person.jsp 管理员个人信息页面 |-------|--Session.jsp 是否登录判断遄 |-----...

    完美解决ajax访问遇到Session失效的问题

    现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不

    nginx反向代理导致session失效的问题解决

    一同事求援:后台系统的登录成功了,但不能成功登进系统,仍然跳转到登录页,但同一套代码另一个环境却没有问题。 背景 经了解,他对同一个项目使用tomcat部署了两个环境,一个在开发服务器上,一个在他本机,两个...

    SSH实现简单的后台管理系统

    此后台管理系统采用了SSH框架,前端采用Struts2的S标签进行表单提交,采用JS进行简单的输入验证。后台与mysql数据库进行连接,dao-service-action都是一一对应,便于理解。此后台管理系统,一共有三个表,用户注册表...

    新版JSP+JQUERY+AJAX+Mysql聊天室小程序JASChatWeb1.0

    (2)打开tomcat/conf/web.xml文件 ,找到 &lt;session-timeout&gt;30&lt;/session-timeout&gt; 一行, 把30改成 1-5的数(作用设置是session超时时间,用于扑捉用户直接关闭浏览器时的下 线状态) 完成以上两步后打开tomcat即可在...

    Java 基于jsp+js+servlet+jdbc+mysql原生界面开发后台管理系统源码(分页,登录、注册、图片上传)等功能

    基于jsp+js+servlet+jdbc+mysql开发产品后台管理系统,实现用户增删改查、分页,登录,注册,图片上传等功能。 包括以下5个功能: 1、登录 用户默认主页index.jsp,可选择【登录】功能,若登录成功,则进入产品管理中...

    新闻后台管理系统.zip

    tomcat9.0 mysql8.0 win10 推荐使用chrome浏览器 2、开发语言 a、 Java(JDBC部分采用druid连接池,连接池登录名admin,密码123456) b、JavaScript c、 标记语言HTML5、CSS d、 引用模板bootstrap、LayUI、...

    MF00617-JAVA餐厅点餐管理源码.zip

    JAVA餐厅点餐管理系统源码带前后台 注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再拍。 开发语言 : JAVA 数据库 : MySQL 开发工具 : Eclipse 源码类型 : WebForm 运行环境:jdk7+tomcat8+mysql+...

    springboot+mybatis+bootstrap开发员工OA后台管理系统

    springboot+mybatis+bootstrap开发员工OA后台管理系统 项目描述 jboa项目有请假以及报销单的申请和审核session共享加登陆拦截人事对人员的管理 员工添加报销单提交到(本部门)部门经理,部门经理通过如果总金额...

    Spring boot整合 Shiro实现RBAC权限控制

    3.session管理:使用shiro默认的session管理替代Tomcat的HttpSession; 4.shiro拦截器:对静态文件(HTML/JS/CSS等)进行权限控制,无权限则请求不到; 5.后台接口权限控制:对后台接口启用权限控制,对应的接口若...

    单点登录源码

    通用用户管理系统, 实现最常用的用户注册、登录、资料管理、个人中心、第三方登录等基本需求,支持扩展二次开发。 &gt; zheng-wechat-mp 微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理...

    Java课程设计-基于JavaWeb和Mysql实现的宿舍管理系统源码带数据库+详细说明文档.zip

    Java用来处理具体业务逻辑,后台跳转、对数据库操作,实现对数据库的增、删、改等操作。 JavaScript用于异步刷新页面和跳转页面。 本次高校宿舍管理系统能够满足用户的基本需求,方便快捷,既节省了时间,提高了...

    智能发票识别系统后台.zip

    使用shiro作为安全管理框架,通过其内置session实现安全登录,使用shiro注解完成权限管理。 算法端 使用Bag of Words + CNN完成票据分类,根据分类结果查询并获取相应的发票模板。 使用SIFT特征匹配和配准思路完成...

    Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip

    第3章-秒杀功能开发及管理后台 学习到了基础的商品下单流程, 查库存,查是否重复下单,减库存,创建订单等过程 知识点 数据库设计(业务第一原则, 无需太注意三大范式) 完成商品列表页 完成商品详情页 完成订单详情页 ...

    健身房预约教练管理系统

    Eclipse、Tomcat、MySQL 技术实现:Spring+SpringMVC+Mybatis+jQuery+Ajax+Highcharts+Bootstrap4 项目描述:模拟预约教练功能,会员通过该系统实现注册、登录、浏览教练信息、预约教练、生成订单、课后确认等功能,...

    web项目-尘歌壶摆设购买系统

    (3)管理员后台登录; (4)摆设管理[摆设展示,摆设添加,摆设修改,摆设删除]; (5)首页展示摆设[分页] (6)首页搜索; (7)用户退出; (8)购物车管理[展示,添加,修改,删除,清空]; (9)订单管理[结账,查看订单,订单...

    通过Nginx+Tomcat+Redis实现持久会话

    样才能真正实现后台多个Tomcat负载平衡,用户请求能够发往任何一个tomcat主机。 keeplived、zabbix与ansible暂不在本文章的范围当中,会在之后的文章逐一进行讲解 实验架构图 部署环境 CentOS7 Nginx1.10.2 ...

Global site tag (gtag.js) - Google Analytics