`
刘琛颖
  • 浏览: 50282 次
  • 性别: 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);
	}
分享到:
评论

相关推荐

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    标题中的"tomcat-redis-session-manager-1.2-tomcat-7-java-7"表明这是一个针对Tomcat服务器,用于管理session的组件,版本为1.2,适配Tomcat 7和Java 7环境。这个组件的主要作用是将Tomcat的会话管理功能与Redis...

    tomcat-redis-session-manager

    4. **处理Session**:在应用程序中,继续像平常一样创建和使用Session,Tomcat-redis-session-manager会在后台透明地处理Session的存储和检索。 5. **监控与优化**:为了确保系统的稳定运行,还需要监控Redis的性能...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    Memcached-Session-Manager是为Tomcat提供集群环境下的Session共享管理功能。MSM借助Memcached这一分布式内存对象缓存系统来存储和管理session,让多个Tomcat实例能够共享用户的会话信息。这样,即使用户的请求在多...

    apache-tomcat-8.0.33-windows-x64(tomcat 下载)

    - **集群**:如果需要高可用性和负载均衡,可以设置Tomcat集群,实现多个实例间的 session 共享。 - **SSL配置**:为了保证数据传输的安全性,可以配置Tomcat支持HTTPS。 在实际开发和生产环境中,了解并熟练掌握...

    管理系统系列--J2EE通用后台管理系统.zip

    EJB有两种类型:Session Beans(会话bean)处理单个用户的交互,而Message-driven Beans(消息驱动bean)则监听消息队列,以异步方式处理任务。 3. **数据访问层**:通过JDBC(Java Database Connectivity)接口与...

    nginx tomcat memcached 集群 session共享

    这里我们讨论的主题是如何通过Nginx、Tomcat和Memcached来实现集群环境下的session共享。Nginx作为反向代理服务器,负责负载均衡,Tomcat作为应用服务器运行Java Web应用程序,而Memcached则作为分布式内存缓存系统...

    tomcat整合nginx负载均衡+memcache共享session全部程序包

    - **Session管理**:Tomcat默认的Session管理机制在集群环境中可能导致Session丢失,因此需要结合Memcache实现Session共享。 3. **Memcache**: - **Session共享**:Memcache是一个高性能的分布式内存对象缓存...

    Keepalived+nginx+tomcat+redis_session_share

    ### Keepalived+nginx+tomcat+redis_session_share #### 环境配置与实现原理 本案例通过搭建一个基于`Keepalived`、`nginx`、`Tomcat`及`Redis`的服务集群来实现应用服务的高可用性和负载均衡,并通过`Redis`实现...

    初学SpringSession讲义大全.docx

    2. 使用 Nginx 负载均衡的 ip_hash 策略:可以使用 Nginx 负载均衡的 ip_hash 策略实现用户每次访问都绑定到同一台具体的后台 tomcat 服务器实现 session 总是存在。 3. 自己写一套 Session 会话管理的工具类:可以...

    基于jsp-tomcat-MysqL的新闻发布系统

    在这个系统中,`jsp`(JavaServer Pages)负责展示动态内容,`tomcat`作为应用服务器处理请求并执行Java代码,而`MysqL`则作为后台数据库存储和管理新闻数据。 1. **jsp**:JSP是一种基于Java的动态网页技术,它...

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

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

    Tomcat安装与相关设置

    - **设置管理界面用户**:在`tomcat-users.xml`文件中添加角色和用户,以允许访问Tomcat的管理后台。例如,添加一个名为“manager”的角色和用户名/密码均为“tomcat”的用户。 6. **Tomcat管理后台** - 管理后台...

    tomcat-7.0.56

    - 通过`Manager App`(需要在`conf/tomcat-users.xml`中添加具有管理权限的用户)可以在Web界面管理部署的应用,包括上传WAR文件,启动、停止、重新加载应用等。 5. **日志和错误处理** - 日志文件通常位于`logs`...

    Springboot+SpringSecurity+SpringSession+Redis+Mybatis-Plus+Swwager.zip

    在这个项目中,Redis作为Spring Session的后台存储,存储用户的会话信息,保证了在高并发场景下的会话一致性。 Mybatis-Plus是在Mybatis基础上进行扩展的ORM(对象关系映射)框架,简化了对数据库的操作,包括插入...

    msm集群session共享

    1. **添加依赖**:首先,需要在项目的依赖管理中引入`msm-kryo-serializer`包,确保所有Tomcat实例都可以使用这个库进行session序列化。 2. **配置session共享**:在每个Tomcat的`conf/context.xml`文件中,定义一...

    Tomcat如何监控并删除超时Session详解

    3. **StandardSession**:它是HttpSession的实现,同时也是Session接口的实现,负责Tomcat内部的会话管理,包括存储和生命周期管理。 4. **StandardSessionFacade**:这是一个门面类,它包裹了一个StandardSession...

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

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

    tomcat 5.5.26

    - **Session Management**:改进了会话管理,支持跨应用的会话跟踪,以及更灵活的会话超时设置。 - **Multipart解析**:支持了多部分表单数据的解析,使得上传文件变得更加简单。 2. **JSP 2.0规范**: - **EL...

    How_Tomcat_Works中文版

    - **资源消耗**:Tomcat 5共享一个后台处理线程,而Tomcat 4每个组件有自己的后台处理线程,因此Tomcat 5在资源消耗方面更具优势。 #### 六、总结 通过深入研究Tomcat的工作原理,我们可以更好地理解Web服务器如何...

Global site tag (gtag.js) - Google Analytics