参考的优秀文章

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&amp;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的外置的更多相关文章

  1. tomcat中session在两个webapp中实现共享

    现在遇到一个需求就是要求完成简单的单点登录,通过在一个tomcat实例中放置两个webapps应用ROOT应用和CEO应用来完成在ROOT应用登录后,在CEO可以直接使用,而未在ROOT应用登录时,不 ...

  2. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  3. Tomcat中session的管理机制

    1.       请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取s ...

  4. Tomcat中session共享问题的简单解决办法

    tomcat-redis-session-manager 使用redis配置tomcat共享session 结构图: 分析: 分布式web server集群部署后需要实现session共享,针对 to ...

  5. Tomcat中session复制技术

    一.准备三台机器主机的服务都正常,nginx与Tomcat构建负载均衡 主机名     IP地址 nginx       192.168.200.111 Tomcat1  192.168.200.11 ...

  6. Tomcat中的Session小结

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...

  7. How Tomcat works — 八、tomcat中的session管理

    在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...

  8. [转]Tomcat中的Session小结

    阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟 ...

  9. 配置tomcat的session共享

    可通过下面方法限制一个用户访问一个服务器之后就只在该服务器上操作. 请求负载过程中会话信息不能丢失.那么在多个tomcat中session需要共享. 配置tomcat的session共享可以有三种解决 ...

随机推荐

  1. java中的动态代理

    1.动态代理的定义:为其他对象提供一个代理以控制对这个对象的访问 2.通过api看下proxy生成代理类的2中写法: 创建某一接口 Foo 的代理: InvocationHandler handler ...

  2. 20145334赵文豪 《Java程序设计》第1周学习总结

    20145334赵文豪 <Java程序设计>第1周学习总结 教材学习内容总结 第一周的学习在紧张中结束了,我们这周了解了各门课的基本内容与授课形式,在第一周java课程的的学习中我们学习了 ...

  3. PNG格式的图像文件,创建的图像的MIME类型的头部

    在安装完这三个组件后,还需要重新配置一次PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一.运行make clean,然后在当前的配置中添加下面的内容: --with-gd=[/path/t ...

  4. block大小和分区最大容量单个文件最大容量的关系

    block大小和单个文件最大容量的关系(文章来自鸟哥的Linux私房菜http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem_1.php#ps2) ...

  5. tomcat重启session不过期的处理

    tomcat关闭后重启,SESSION 仍然有效的处理方法很多时候明明在服务器上关闭了TOMCAT,但是客户端的表示 SESSION仍然在线,原因及解决方案如下: 每当正常关闭或者重启tomcat服务 ...

  6. A trip through the Graphics Pipeline 2011_06_(Triangle) rasterization and setup

    Welcome back. This time we’re actually gonna see triangles being rasterized – finally! But before we ...

  7. Ueditor 1.4.3.1 使用 ThinkPHP 3.2.3 的上传类进行图片上传

    在 ThinkPHP 3.2.3 中集成百度编辑器最新版 Ueditor 1.4.3.1,同时将编辑器自带的上传类替换成 ThinkPHP 3.2.3 中的上传类. ① 下载编辑器(下载地址:http ...

  8. Unity3D中自带事件函数的执行顺序(转)

    原文:http://www.jianshu.com/p/1d93ece664e2 在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(E ...

  9. VS2010 更改C#类库模板

    首先你找到你自己的 VS2010安装目录,例如我本地是: D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTem ...

  10. 开发回归测试之Selenium开发环境搭建

    前言 在解bug的过程中,经常遇到解完某个bug带来新的bug,原因一般是因为回归测试不足或不全面,下面我们来看看怎么利用selenium工具来完成开发后的回归测试, 虽然这可能是QA的事,不过有利于 ...