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

猜你喜欢

转载自tangmingjie2009.iteye.com/blog/1772169