最近对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 的持久化 在 Web 应用程序中,Session 是一种用来跟踪用户状态的机制。Tomcat_Session 的持久化是指将 HttpSession 对象保存到文件系统或数据库中,以便在服务器关闭或重启时可以恢复 Session 数据...
博文链接:https://wangxuliangboy.iteye.com/blog/237534
例如,可以使用Servlet容器(如Tomcat)的内置Session持久化配置,或者自定义实现`HttpSessionListener`和`HttpSessionBindingListener`来监听Session的创建和销毁事件,进行手动持久化操作。 标签中的"源码"可能...
标题"tomcat session存到mencache"指的是将Tomcat的session持久化存储到Memcache中,以提高性能和可扩展性。 Memcache可以在多台服务器之间共享session数据,从而支持负载均衡和高可用性。对于描述中提到的“版本为...
根据给定文件的信息,本文将围绕“Session 用户交互间隔与 Session 持久化”这一主题进行深入探讨,包括 Session 的基本概念、Tomcat 中 Session 的管理方式、Session 的持久化机制以及用户交互间隔等内容。...
3. **Redis**:Redis是一个开源的键值存储系统,支持多种数据结构如字符串、哈希、列表、集合和有序集合,且具有高速缓存和持久化能力。在本场景中,Redis作为Session的中央存储,所有Tomcat服务器都向Redis读写...
Tomcat服务器不再负责Session的持久化,而是将Session数据写入Redis,所有服务器都能访问这些数据。Nginx可以通过配置将Session ID传递给Tomcat,Tomcat再根据ID从Redis中获取Session信息。这样即使服务器发生故障,...
此外,Redis的高并发性能和持久化能力也能保障在高负载下的服务稳定性。 请注意,此方法仅适用于JDK 8及以上版本。如果你的环境是JDK 7或更低,需要寻找兼容的Redis会话管理器库。同时,为了保证最佳效果,建议定期...
这种方式不仅可以解决Session丢失的问题,还具有高可用性,因为Redis可以提供持久化存储,即使某个Tomcat实例宕机,恢复后也能快速找回Session信息。同时,由于Session数据存储在独立的Redis中,对于提升应用性能也...
Redis是一个高性能的键值对数据存储系统,常用于缓存和持久化数据。它的高速读写能力使其成为存储session的理想选择,尤其是在分布式环境中,可以轻松实现session共享。 **知识点三:tomcat-redis-session-manager*...
Memcached因其高性能和轻量级特性,在分布式环境中常被用作Session持久化存储。 5. **Minglog**: Minglog可能是一个日志记录库,它可以帮助开发者追踪和分析与Session共享相关的操作,对于调试和优化系统性能至关...
可以通过设置合适的session过期时间、使用Redis的持久化机制以及监控Redis的性能,来优化session共享的效率和可靠性。 总结来说,"nginx+tomcat shiro实现多tomcat下session共享"是一种常见的分布式系统架构策略,...
在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高并发、分布式环境中可能会面临效率低下和数据一致性的问题。为了解决这些问题...
2. **持久化**:为了防止Redis数据丢失,需要启用数据持久化功能,如RDB或AOF,确保即使Redis重启,Session数据也能恢复。 3. **过期策略**:合理设置Session的过期时间,防止内存占用过高,同时需要处理Session...
这是一个开源项目,它允许Tomcat服务器将用户的session数据持久化到Redis数据库中,而不是传统的内存或本地硬盘。这样,无论用户访问哪个服务器节点,都能获取到正确的session信息,从而实现负载均衡下的会话持久性...
为了解决这些问题,可以将Tomcat的session持久化到外部存储,比如Redis,一个高性能的键值数据库,特别适合用于存储这类临时但重要的数据。 首先,让我们理解Tomcat的session管理机制。默认情况下,Tomcat会将...
此外,为了保证数据安全,还可以配置Redis进行数据持久化,防止服务器重启导致session丢失。 总的来说,通过使用Tomcat和Redis,我们可以构建一个高效且可扩展的session共享方案,为大型Web应用提供稳定的服务。...
这是Tomcat的持久化Session管理器,可以与其他存储机制集成。 3. **配置RedisStore**:配置`Manager`的属性,包括`storeClass`,设置为`org.apache.catalina.session.RedisStore`,这告诉Tomcat使用Redis作为...
在分布式系统中,Session共享是一个常见的挑战,尤其是在多个服务器之间,比如使用Tomcat作为Web容器的环境。...因此,在实际生产环境中,可能需要结合持久化存储或者其他的Session复制策略来确保数据的安全性。