st0627 发表于 2017-1-21 09:30:44

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
页: [1]
查看完整版本: tomcat session 持久化