Tomcat会开启一个后台线程每隔一段时间检查Session的有效性,这个线程是在Tomcat启动的时候当StardardEngine启动时随之启动的。可以参看StardardEngine的基类ContainerBase的#threadStart()方法:
这个方法启动了一个ContainerBackgroundProcessor类的线程,这个类重写的#run()方法中包括了对Session的有效性监控。具体的细节就不详细陈述了。每隔一段时间,此线程就会启动一次并调用了ManageBase的#backgroundProcess()方法。其源代码如下:
每隔一段时间就会调用processExpires()方法去判断Session的有效性。
此方法最终调用了isValid()去判断和设定Session是否失效,源代码如下所示:
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); }
发表评论
-
出现java.lang.UnsupportedClassVersionError 错误的原因
2010-08-16 23:11 866出现java.lang.UnsupportedClassVer ... -
Tomcat请求处理(七) - Servlet实例的调用
2009-05-07 11:36 1125Tomcat请求处理中Servlet实例的调用是和Filter ... -
请求在Tomcat中传到了CoyoteAdapter的#service()方法中后,就要准备进入Pi
2009-05-07 11:35 1797首先,来看一下Servlet的载入过程。 具体是在org.ap ... -
Tomcat请求处理(五) -- 请求在容器间的流动
2009-05-07 11:34 1427请求在Tomcat中传到了CoyoteAdapter的#ser ... -
Tomcat请求处理(四) -- Request, Response, 和Pipeline
2009-05-07 11:33 12791. Request和Response 当处理请求的时候,To ... -
Tomcat请求处理(三) -- coyote请求处理
2009-05-07 11:32 1319在上一篇文章文章中,Tomcat的请求处理到了JIoEndpo ... -
Tomcat请求处理(二) -- 请求处理框架
2009-05-07 11:30 983书接上文。 当Tomcat的Acceptor监听到有请求到来时 ... -
Tomcat请求处理(一) -- 服务器端口监听
2009-05-07 11:29 1392其实tomcat在哪个类中监听请求的代码很容易找到: 在org ... -
Tomcat启动部分源代码分析(五) -- 应用程序加载
2009-05-07 11:28 1193前面所叙述的tomcat启动 ... -
Tomcat启动部分源代码分析(四) -- 开启容器
2009-05-07 11:27 1199四. 开启容器 最后是Bootstrap#start()方法的 ... -
Tomcat启动部分源代码分析(三) -- 载入
2009-05-07 11:23 1187二. 载入 2. Bootstrap的#Bootstrap#l ... -
Tomcat启动部分源代码分析(二) -- 初始化
2009-05-07 11:20 1091二. 初始化 1. 首先是Bootstrap的#init()操 ... -
Tomcat启动部分源代码分析(一) -- 概览
2009-05-07 11:17 1426一. 概览 本文所涉及的Tomcat为6.0版本。 Tomca ... -
Tomcat的Session管理(一) - Session的生成
2009-05-07 10:02 1489Session对象的创建一般是源于这样的一条语句: Sessi ...
相关推荐
标题中的"tomcat-redis-session-manager-1.2-tomcat-7-java-7"表明这是一个针对Tomcat服务器,用于管理session的组件,版本为1.2,适配Tomcat 7和Java 7环境。这个组件的主要作用是将Tomcat的会话管理功能与Redis...
4. **处理Session**:在应用程序中,继续像平常一样创建和使用Session,Tomcat-redis-session-manager会在后台透明地处理Session的存储和检索。 5. **监控与优化**:为了确保系统的稳定运行,还需要监控Redis的性能...
Memcached-Session-Manager是为Tomcat提供集群环境下的Session共享管理功能。MSM借助Memcached这一分布式内存对象缓存系统来存储和管理session,让多个Tomcat实例能够共享用户的会话信息。这样,即使用户的请求在多...
- **集群**:如果需要高可用性和负载均衡,可以设置Tomcat集群,实现多个实例间的 session 共享。 - **SSL配置**:为了保证数据传输的安全性,可以配置Tomcat支持HTTPS。 在实际开发和生产环境中,了解并熟练掌握...
EJB有两种类型:Session Beans(会话bean)处理单个用户的交互,而Message-driven Beans(消息驱动bean)则监听消息队列,以异步方式处理任务。 3. **数据访问层**:通过JDBC(Java Database Connectivity)接口与...
这里我们讨论的主题是如何通过Nginx、Tomcat和Memcached来实现集群环境下的session共享。Nginx作为反向代理服务器,负责负载均衡,Tomcat作为应用服务器运行Java Web应用程序,而Memcached则作为分布式内存缓存系统...
- **Session管理**:Tomcat默认的Session管理机制在集群环境中可能导致Session丢失,因此需要结合Memcache实现Session共享。 3. **Memcache**: - **Session共享**:Memcache是一个高性能的分布式内存对象缓存...
### Keepalived+nginx+tomcat+redis_session_share #### 环境配置与实现原理 本案例通过搭建一个基于`Keepalived`、`nginx`、`Tomcat`及`Redis`的服务集群来实现应用服务的高可用性和负载均衡,并通过`Redis`实现...
2. 使用 Nginx 负载均衡的 ip_hash 策略:可以使用 Nginx 负载均衡的 ip_hash 策略实现用户每次访问都绑定到同一台具体的后台 tomcat 服务器实现 session 总是存在。 3. 自己写一套 Session 会话管理的工具类:可以...
在这个系统中,`jsp`(JavaServer Pages)负责展示动态内容,`tomcat`作为应用服务器处理请求并执行Java代码,而`MysqL`则作为后台数据库存储和管理新闻数据。 1. **jsp**:JSP是一种基于Java的动态网页技术,它...
|-------|--ListNews.jsp 后台管理新闻列表页面 |-------|--Logout.jsp 退出系统页面 |-------|--Modifynews.jsp 修改新闻 |-------|--Person.jsp 管理员个人信息页面 |-------|--Session.jsp 是否登录判断遄 |-----...
- **设置管理界面用户**:在`tomcat-users.xml`文件中添加角色和用户,以允许访问Tomcat的管理后台。例如,添加一个名为“manager”的角色和用户名/密码均为“tomcat”的用户。 6. **Tomcat管理后台** - 管理后台...
- 通过`Manager App`(需要在`conf/tomcat-users.xml`中添加具有管理权限的用户)可以在Web界面管理部署的应用,包括上传WAR文件,启动、停止、重新加载应用等。 5. **日志和错误处理** - 日志文件通常位于`logs`...
在这个项目中,Redis作为Spring Session的后台存储,存储用户的会话信息,保证了在高并发场景下的会话一致性。 Mybatis-Plus是在Mybatis基础上进行扩展的ORM(对象关系映射)框架,简化了对数据库的操作,包括插入...
1. **添加依赖**:首先,需要在项目的依赖管理中引入`msm-kryo-serializer`包,确保所有Tomcat实例都可以使用这个库进行session序列化。 2. **配置session共享**:在每个Tomcat的`conf/context.xml`文件中,定义一...
3. **StandardSession**:它是HttpSession的实现,同时也是Session接口的实现,负责Tomcat内部的会话管理,包括存储和生命周期管理。 4. **StandardSessionFacade**:这是一个门面类,它包裹了一个StandardSession...
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不
- **Session Management**:改进了会话管理,支持跨应用的会话跟踪,以及更灵活的会话超时设置。 - **Multipart解析**:支持了多部分表单数据的解析,使得上传文件变得更加简单。 2. **JSP 2.0规范**: - **EL...
- **资源消耗**:Tomcat 5共享一个后台处理线程,而Tomcat 4每个组件有自己的后台处理线程,因此Tomcat 5在资源消耗方面更具优势。 #### 六、总结 通过深入研究Tomcat的工作原理,我们可以更好地理解Web服务器如何...