【Session】Tomcat中Session持久化到文件系统或数据库
参考的优秀文章
Tomcat Session 持久化
Package org.apache.catalina.session
最近同事在做Session外置的功能,我对Session持久化、共享也不太了解,学习一下。
一般来说,Tomcat原生的持久化Session方式,有StandardManager和PersistentManager。
版本说明:apache-tomcat-7.0.69-windows-x64
关闭、重启Tomcat,是否持久化Session
Tomcat在关闭的时候,持久化Session到工作目录中,然后再次启动时再加载,对用户感觉Session是持续地存在的。
页面用到一个实体类:
package com.nicchagil.session;import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String userName;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + "]";}}
View Code
(扩展知识)关于序列化:
需注意的是:因为到时Session需要序列化到文件系统中,而这个类的对象需要放到Session中,所以这个类需要被序列化,故实现序列化接口。
如果实现序列化接口,强烈建议显示定义serialVersionUID,它表明了序列化版本号。如果没定义,serialVersionUID将由JVM自动运算,而serialVersionUID的运算值高度依赖class的编译结果,所以,基于稳定性考虑,我们还是显式定义此class的序列化版本为上。
实验步骤:
1、启动Tomcat,我们写入往Session写入一些东西。如果不确认是否写入,可以尝试读取出来,是否成功读取。
2、关闭Tomcat,查看Tomcat的工作目录的有没有SESSIONS.ser文件。
文件的路径可能跟我们运行的环境有关:
如果我用Tomcat独立运行,该文件位于:D:\green\apache-tomcat-7.0.69-windows-x64\apache-tomcat-7.0.69\work\Catalina\localhost\041SessionSerialization\SESSIONS.ser
如果在Eclipse运行Tomcat,因Tomcat的工作目录配置不同(不同的配置方式又不同),该文件在于:D:\workspace\jee_workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\041SessionSerialization\SESSIONS.ser
3、启动Tomcat,在没有写入Session的前提下,尝试读取Session,以测试Tomcat是否把持久化的Session恢复。
注:
如果Session重启后没有恢复,检查Tomcat的context.xml配置文件的这个部分:
<!-- Uncomment this to disable session persistence across Tomcat restarts --><!--<Manager pathname="" />-->
View Code
默认的Tomcat配置是注释着的,说明没有禁用持久化缓存的功能,说明Tomcat重启时默认持久化Session。
使用PersistentManager持久化Session
PersistentManager的主要功能:在系统运行中,持久化Session或恢复Session。
它的意义在于:
1、Tomcat关闭、重启时的Session持久化
2、备份Session以增强系统容错能力
3、将处理内存的Session持久化到硬盘,避免因Session过多而内存溢出
持久化到文件系统
将Session持久化到文件系统的配置:
<Manager className="org.apache.catalina.session.PersistentManager"saveOnRestart="true"maxActiveSession="-1"minIdleSwap="0"maxIdleSwap="30"maxIdleBackup="0"> <Store className="org.apache.catalina.session.FileStore"checkInterval="60"directory="../session/mySession.session"/></Manager>
View Code
启动Tomcat后,写入Session后,观察TOMCAT_HOME/work/Catalina/localhost/session下文件的变化。
持久化到数据库
将Session持久化到数据库的配置:
跟上例类似,只不过这次的store是DB的store,是存储策略的不同。(这里测试使用MySQL 5.0)
<Manager className="org.apache.catalina.session.PersistentManager"saveOnRestart="true"maxActiveSession="-1"minIdleSwap="0"maxIdleSwap="30"maxIdleBackup="0"> <!-- file store --><!-- <Store className="org.apache.catalina.session.FileStore"checkInterval="60"directory="../session"/>--><!-- db store --><Store className="org.apache.catalina.session.JDBCStore"driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/demo?user=root&password=123456" sessionTable="t_session" sessionIdCol="session_id" sessionDataCol="data" sessionValidCol="session_valid" sessionMaxInactiveCol="max_inactive" sessionLastAccessedCol="last_access"sessionAppCol="application_name" checkInterval="60" debug="99" /></Manager>
View Code
然后表结构如下:
CREATE TABLE `t_session` (`session_id` varchar(128) DEFAULT NULL,`data` mediumblob,`max_inactive` int(128) DEFAULT NULL,`last_access` bigint(20) DEFAULT NULL,`application_name` varchar(128) DEFAULT NULL,`session_valid` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
View Code
记得将MySQL的驱动包放入Tomcat的lib目录下。
启动后,写入Session后,观察t_session的变化。
附录
用到的类的关系图
更多配置
关于StandardManager和PersistentManager更多的配置,请见Package org.apache.catalina.session。
【Session】Tomcat中Session持久化到文件系统或数据库相关推荐
- Tomcat中session的管理机制
https://www.cnblogs.com/coldridgeValley/p/6016211.html 如果sessionId保留在url中是以如下形式:http://xxx.com?a=1&a ...
- Tomcat中的Session小结
什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...
- JavaWeb中Session详解
1.Session是什么: "会话控制",Session对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会 ...
- tomcat的session共享
转自:https://blog.csdn.net/weixin_33940102/article/details/85973141 可通过下面方法限制一个用户访问一个服务器之后就只在该服务器上操作. ...
- 服务器端Session和客户端Session, 以及cookie的区别
Session其实分为客户端Session和服务器端Session. 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由24个字符组 ...
- 服务器端Session、客户端Session和Cookie的区别
1.Session其实分为客户端Session和服务器端Session. 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由24个字 ...
- tomcat中的session管理
Session的管理 当一个sesson开始时,Servlet容器会创建一个HttpSession对象,在某些情况下把这些Httpsession对象从内存中转移到文件系统中或数据库中,需要访问的时候在 ...
- 关于 tomcat 集群中 session 共享的三种方法
前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持 ...
- Tomcat中两个不同项目共享Session
本文研究的是同一个Tomcat目录下的两个不同的应用共享同一个session.由于每个WEB应用程序都有一个唯一的一个ServletContext实例对象,本应用中的所有的servlet共享此Serv ...
最新文章
- 【AJAX】JavaScript的面向对象
- 求e的近似值java_7-78 求e的近似值 (15 分)
- 【计算理论】可判定性 ( 非确定性有限自动机的接受问题 | 证明 “非确定性有限自动机的接受问题“ 的可判定性 )
- 10、Power Query-合并查询与追加查询结合应用
- Android输出签名的 SHA1 值
- WEB攻防实战篇,思维导图
- Java内置的观察者模式的使用
- 21南阳理工oj新生赛Round#5--这是一道防ak题
- 此设备不允许更改其写入高速缓存设置_优化SiT15xx驱动器设置32 kHz晶体输入低功耗MCU程序设计细节(一)...
- WCF 4.0一个鲜为人知的改变[兼书名征集]
- 表上作业法-运输问题(Java)
- c语言程序设计小球弹跳,C语言实现弹跳小球
- dhcp服务器可以连接无线网吗,无线网dhcp服务器设置
- 在oracle存储过程中创建临时表
- 手把手撸一个小而美的日历组件
- 使用Ansible部署器设置一个小型的TF+K8s实验室
- django后台搜索显示Related Field got invalid lookup: icontains
- Mac 卸载自己安装的python
- Algorithm:数学建模大赛(CUMCM/NPMCM)之数学建模(经验/技巧)、流程(模型准备/模型假设/建模/求解/分析/优化/预测/评价)、论文写作(意义/摘要/关键词/问题重述和模型假设/建
- 你觉得java与嵌入式学哪个好?
热门文章
- Boost:Boost概念的function_requires()的测试程序
- boost::convert模块实现算法的测试程序
- boost::callable_traits移除const成员的测试程序
- ITK:使用Otsu阈值图像
- VTK:图表之VertexSize
- OpenGL text rendering文字渲染的实例
- 主机字节序与网络字节序
- QT的QDBusPendingReply类的使用
- C++多态案例三-电脑组装
- C++ Priority Queues(优先队列)