`
tmj_159
  • 浏览: 707131 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论

tomcat session 持久化

 
阅读更多

        最近对tomcat比较感兴趣,会陆续的发一些学习tomcat的心得。

 

        今天看的是tomcat session持久化,关于session持久化我上官网上除了API没有找到相关的文档,只有在其它论坛网站上有很多哥们提到了。

 

         所谓session持久化就是将内存中的session保存到磁盘(文件)中,Tomcat有两种标准的持久化方案:

一种是保存在文件,另外一种是保存在数据库中。虽然session持久化用的很少,了解下还是可以的。

        默认情况下Tomcat提供的是StandardManager管理

org.apache.catalina.session.StandardManager

        StandardManager 里面提供了很多参数来管理,诸如maxActiveSessions,pathname,

maxInactiveInterval.... 还提供了load和unload方法来加载和持久化session。

修改配置文件catalina_home/conf/context.xml,取消注释的Manager

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

        当你正常关闭(直接关闭进程不算)tomcat的时候,tomcat会将session保存在 catalina_home/work/catalina/localhost/项目名称/session.ser文件中。

       一、保存在文件中

        StandardManager可以保存在文件中,还有FileLoad也可以保存在文件中,不过FileLoad需要PersistentManager的帮助。这对我们来说更加的方便了,因为持久化逻辑,和持久化的动作分开了。

我们在catalina_home/conf/context.xml中添加如下配置信息:

<Manager className="org.apache.catalina.session.PersistentManager">
	debug=0
        saveOnRestart="true"
	maxActiveSession="-1"
	minIdleSwap="-1"
	maxIdelSwap="-1"
	<Store className="org.apache.catalina.session.FileStore" directory="../session"/>
    </Manager>

    重启之后,让服务器产生session,然后正常关闭。

    持久化的session文件在catalina_home/work/catalina/localhost/session下

 

二、保存在数据库中

    使用tomcat中

org.apache.catalina.JDBCStore

    具体参数看源码吧,这里我上网上找了一个配置:

<Store calssName="org.apache.catalina.JDBCStore" driverName="com.mysql.jdbc.Driver" 
connectionURL="jdbc:mysql://localhost/session?usename=xxx&password=xxx" 
sessionTable="session" sessionIdCol="session_id" sessionDataCol="session_data" 
sessionValidCol="sessionValid" sessionMaxInactiveCol="maxInactive" 
sessionLastAccessedCol="lastAccess" sessionAppCol="appName" checkInterval="60" debug="99" /> 

 这样就能把session 保存到数据库中了。

 

三、自定义存储方式

    看看三个类之间的关系:

StandardManager extends ManagerBase

PersistentManager extends PersistentManagerBase
PersistentManagerBase extends ManagerBase

FileStore extends StoreBase
JDBCStore extends StoreBase

   

        所以我们如果想改变存储的方式,如果想存缓存中(eg: memcached这样的)

我们可以写一个类继承StoreBase即可,我这里写了一个简单的,里面什么功能都没有,只是一些简单的systemout 来演示下:

package cn.tang;

import org.apache.catalina.Session;
import org.apache.catalina.session.StoreBase;

public class MySessionStore extends StoreBase{

	public Session load(String s) throws ClassNotFoundException, IOException {
		System.out.println("---------invoke load method------------");
		return null;
	}

	public void remove(String s) throws IOException {
		System.out.println("---------invoke remove method------------");
	}

	public void save(Session session) throws IOException {
		System.out.println("---------invoke save method------------");
	}

	public void clear() throws IOException {
		System.out.println("---------invoke save method------------");
	}

	public int getSize() throws IOException {
		System.out.println("---------invoke save method------------");
		return 0;
	}

	public String[] keys() throws IOException {
		System.out.println("---------invoke save method------------");
		return null;
	}
	
}

 打成一个jar包,放入catalina_home/lib中,同理修改context.xml文件

<Manager className="org.apache.catalina.session.PersistentManager">
	debug=0
        saveOnRestart="true"
	maxActiveSession="-1"
	minIdleSwap="-1"
	maxIdelSwap="-1"
	<Store className="cn.tang.MySessionStore"/>
    </Manager>

 重启之后,你会发现每个方法会有输出,关于如果写入到第三方缓存中,这是另一个话题了,有机会再说。

PS: 关于Session和Memcached已经有成熟的解决方案了,感兴趣的可以看下面的链接,

https://github.com/magro/memcached-session-manager

 

 

分享到:
评论

相关推荐

    Tomcat_Session的持久化

    Tomcat_Session 的持久化 在 Web 应用程序中,Session 是一种用来跟踪用户状态的机制。Tomcat_Session 的持久化是指将 HttpSession 对象保存到文件系统或数据库中,以便在服务器关闭或重启时可以恢复 Session 数据...

    TOMCAT SESSION的持久化方法

    博文链接:https://wangxuliangboy.iteye.com/blog/237534

    javaee-Session持久化小结

    例如,可以使用Servlet容器(如Tomcat)的内置Session持久化配置,或者自定义实现`HttpSessionListener`和`HttpSessionBindingListener`来监听Session的创建和销毁事件,进行手动持久化操作。 标签中的"源码"可能...

    tomcat session存到mencache

    标题"tomcat session存到mencache"指的是将Tomcat的session持久化存储到Memcache中,以提高性能和可扩展性。 Memcache可以在多台服务器之间共享session数据,从而支持负载均衡和高可用性。对于描述中提到的“版本为...

    session之用户交互间隔&&session持久化

    根据给定文件的信息,本文将围绕“Session 用户交互间隔与 Session 持久化”这一主题进行深入探讨,包括 Session 的基本概念、Tomcat 中 Session 的管理方式、Session 的持久化机制以及用户交互间隔等内容。...

    tomcat redis session.rar

    3. **Redis**:Redis是一个开源的键值存储系统,支持多种数据结构如字符串、哈希、列表、集合和有序集合,且具有高速缓存和持久化能力。在本场景中,Redis作为Session的中央存储,所有Tomcat服务器都向Redis读写...

    tomcat-session共享

    Tomcat服务器不再负责Session的持久化,而是将Session数据写入Redis,所有服务器都能访问这些数据。Nginx可以通过配置将Session ID传递给Tomcat,Tomcat再根据ID从Redis中获取Session信息。这样即使服务器发生故障,...

    Tomcat8(Tomcat9)+redis实现Session共享(支持Redis集群)

    此外,Redis的高并发性能和持久化能力也能保障在高负载下的服务稳定性。 请注意,此方法仅适用于JDK 8及以上版本。如果你的环境是JDK 7或更低,需要寻找兼容的Redis会话管理器库。同时,为了保证最佳效果,建议定期...

    Tomcat7+Redis+Session 负载之后session 共享 tomcat jar包

    这种方式不仅可以解决Session丢失的问题,还具有高可用性,因为Redis可以提供持久化存储,即使某个Tomcat实例宕机,恢复后也能快速找回Session信息。同时,由于Session数据存储在独立的Redis中,对于提升应用性能也...

    tomcat-redis-session-manager包集合下载(tomcat8)

    Redis是一个高性能的键值对数据存储系统,常用于缓存和持久化数据。它的高速读写能力使其成为存储session的理想选择,尤其是在分布式环境中,可以轻松实现session共享。 **知识点三:tomcat-redis-session-manager*...

    tomcat做session共享需要的全部jar包

    Memcached因其高性能和轻量级特性,在分布式环境中常被用作Session持久化存储。 5. **Minglog**: Minglog可能是一个日志记录库,它可以帮助开发者追踪和分析与Session共享相关的操作,对于调试和优化系统性能至关...

    nginx+tomcat shiro实现多tomcat下session共享

    可以通过设置合适的session过期时间、使用Redis的持久化机制以及监控Redis的性能,来优化session共享的效率和可靠性。 总结来说,"nginx+tomcat shiro实现多tomcat下session共享"是一种常见的分布式系统架构策略,...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高并发、分布式环境中可能会面临效率低下和数据一致性的问题。为了解决这些问题...

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    2. **持久化**:为了防止Redis数据丢失,需要启用数据持久化功能,如RDB或AOF,确保即使Redis重启,Session数据也能恢复。 3. **过期策略**:合理设置Session的过期时间,防止内存占用过高,同时需要处理Session...

    tomcat-redis-session-manager

    这是一个开源项目,它允许Tomcat服务器将用户的session数据持久化到Redis数据库中,而不是传统的内存或本地硬盘。这样,无论用户访问哪个服务器节点,都能获取到正确的session信息,从而实现负载均衡下的会话持久性...

    tomcat session redis支持

    为了解决这些问题,可以将Tomcat的session持久化到外部存储,比如Redis,一个高性能的键值数据库,特别适合用于存储这类临时但重要的数据。 首先,让我们理解Tomcat的session管理机制。默认情况下,Tomcat会将...

    tomcat实现session共享

    此外,为了保证数据安全,还可以配置Redis进行数据持久化,防止服务器重启导致session丢失。 总的来说,通过使用Tomcat和Redis,我们可以构建一个高效且可扩展的session共享方案,为大型Web应用提供稳定的服务。...

    Tomcat实现session共享demo

    这是Tomcat的持久化Session管理器,可以与其他存储机制集成。 3. **配置RedisStore**:配置`Manager`的属性,包括`storeClass`,设置为`org.apache.catalina.session.RedisStore`,这告诉Tomcat使用Redis作为...

    Memcached+tomcat session共享jar 和tomcat xml配置

    在分布式系统中,Session共享是一个常见的挑战,尤其是在多个服务器之间,比如使用Tomcat作为Web容器的环境。...因此,在实际生产环境中,可能需要结合持久化存储或者其他的Session复制策略来确保数据的安全性。

Global site tag (gtag.js) - Google Analytics