【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;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + "]";
}
}
(扩展知识)关于序列化:
需注意的是:因为到时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="" />
-->
默认的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>
启动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>
然后表结构如下:
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;
记得将MySQL的驱动包放入Tomcat的lib目录下。
启动后,写入Session后,观察t_session的变化。
附录
用到的类的关系图

更多配置
关于StandardManager和PersistentManager更多的配置,请见Package org.apache.catalina.session。
【Session】Tomcat中Session持久化到文件系统或数据库的更多相关文章
- tomcat中session在两个webapp中实现共享
现在遇到一个需求就是要求完成简单的单点登录,通过在一个tomcat实例中放置两个webapps应用ROOT应用和CEO应用来完成在ROOT应用登录后,在CEO可以直接使用,而未在ROOT应用登录时,不 ...
- 【Session】Tomcat中Session的外置
> 参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化. ...
- Tomcat中session的管理机制
1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取s ...
- Tomcat中session共享问题的简单解决办法
tomcat-redis-session-manager 使用redis配置tomcat共享session 结构图: 分析: 分布式web server集群部署后需要实现session共享,针对 to ...
- Tomcat中session复制技术
一.准备三台机器主机的服务都正常,nginx与Tomcat构建负载均衡 主机名 IP地址 nginx 192.168.200.111 Tomcat1 192.168.200.11 ...
- Tomcat中的Session小结
什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...
- How Tomcat works — 八、tomcat中的session管理
在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...
- [转]Tomcat中的Session小结
阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟 ...
- 配置tomcat的session共享
可通过下面方法限制一个用户访问一个服务器之后就只在该服务器上操作. 请求负载过程中会话信息不能丢失.那么在多个tomcat中session需要共享. 配置tomcat的session共享可以有三种解决 ...
随机推荐
- 共享单车微信小程序
微信小程序bike单车,前台使用小程序地图控件+weui+小程序相关组件和API,后台使用SpringBoot+JPA,用户及单车信息保存进mongodb,短信平台的配置信息和临时生成的验证码存放进r ...
- ios中tableview侧栏的折叠
#import "ViewController.h" #define Ksmall 40.0f #define Klarge 80.0f #define KNoOpen @&quo ...
- 怎么样入门python?来自知乎
作者:谢科链接:https://www.zhihu.com/question/20899988/answer/24923424来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- hihocoder216周:贪心或二分
题目链接 有N条线段,要切K刀,使得最长的线段尽量短.在最佳切割的条件下,切完之后最长的那根绳子是多长. 方法一:贪心 每次切的那一刀必然是最长的那条线段,用优先队列,每次往最长的那条线段上切一刀 方 ...
- 超酷的 Vim 搜索技巧
尽管目前我们已经涉及 Vim 的多种特性,但此编辑器的特性集如此庞大,不管我们学习多少,似乎仍然远远不足.承接我们的 Vim 教程系列,本文我们将讨论 Vim 提供的多种搜索技术. 不过在此之前,请注 ...
- linux达人养成计划学习笔记(四)—— 压缩命令
一.常见的压缩格式: 二..zip格式压缩 1.压缩文件.文件夹 zip 压缩后文件名(.zip结尾) 压缩文件名zip -r 压缩后文件夹(.zip结尾) 压缩文件 2.解压缩 unzip 压缩文件 ...
- Python学习笔记(九)—— 函数
一.函数调用: 1.python内部函数查询:http://docs.python.org/3/library/functions.html#abs 2.注意调用函数的参数个数和类型. 3.函数名其实 ...
- HDU 4632 Palindrome subsequence (区间DP)
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- 【jQuery】利用jQuery实现“记住我”的功能
[1]先下载jQuery.cookie插件:使用帮助请参考链接(https://github.com/carhartl/jquery-cookie). [2]安装插件: <script type ...
- Spark日志清洗
日志数据清洗,主要采用spark 的定时任务,清洗出有效数据,并保存到hive数据仓库中存储.常用流程如下: 参考:https://gaojianhua.gitbooks.io/bigdata-wik ...