第一讲—Tomcat Session持久化

网上讲Session持久化的东西很多,我这里只写我实践过的, 系统化的东西还是网上自己去看吧。

    本实例的环境:

    操作系统:Mac OS

    Tomcat:7.052

    JDK:1.7

 

一、将Session持久化到文件.

    1.新建一个WEB应用,编写一个Servlet,在Servlet里面打印当前请求的SessionID,代码如下:

package com.minutch;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet ( "/GetInfoServlet" )
public class GetInfoServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
     public GetInfoServlet() {
         super ();
     }
 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         HttpSession session = request.getSession();
         PrintWriter out = response.getWriter();
         out.println( "Tomcat" + new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new Date()) + "   sessionId----->" + session.getId());
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     }
}       

    2.Tomcat持久化的方式(Tomcat默认带了两种持久化方式,StandardManager,PersistentManager两种)

        2.1 StandardManager  默认的方法,在关闭时Tomcat会自动保存Session到session.ser 文件里,所以在默认的Tomcat里,你重启Tomcat,Session依然是上次的Session。如果你想每次关闭后销毁Session,只要把context.xml的这段配置注释去掉就行,请自己动手实践,不知道如何实践可以联系chongjian.min@tqmall.com。

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->

        2.2 PersistentManager 提供了很灵活的管理方式 配置性强,本次讲解的是通过PersistentManager讲Session持久化到文件。


    3. Tomcat使用PersistentManager持久化Session的配置

        打开Tomcat的配置文件  ${TomcatHome}/conf/content.xml,配置信息如下:        

< Context >
     <!-- Default set of monitored resources -->
     < WatchedResource >WEB-INF/web.xml</ WatchedResource >
     <!-- Uncomment this to disable session persistence across Tomcat restarts -->
     <!--
     <Manager pathname="" />
     -->
 
     <!--添加该Manager节点配置,将Session持久化到文件-->
     < Manager className = "org.apache.catalina.session.PersistentManager" >
         debug=0
         saveOnRestart="true"
         maxActiveSession="-1"
         minIdleSwap="-1"
         maxIdleSwap="-1"
         maxIdleBackup="1"
     < Store className = "org.apache.catalina.session.FileStore"
            directory = "/Users/Minutch/tomcatSession"
            />
     </ Manager >
 
     <!-- Uncomment this to enable Comet connection tacking (provides events
          on session expiration as well as webapp lifecycle) -->
     <!--
     <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
     -->
</ Context >

        className:Session的管理类,tomcat将会通过定义的接口来应用该类生成的对象。
        debug:Session管理器的跟踪级别。
        saveOnRestart:(true/false)配置服务重启工程中对session的处理,若为true,则关闭前把有效的session保存,启动后重新载入
        maxActiveSession:活动状态Session的最大数,为-1时则不限制,否则Session Manager将会把超出的Session对象转移到Session Store中。
        minIdleSwap:Session不活动的最短时间,超过该时间,Session Manager 可能会把该Session对象转移到Session Store中,单位为秒。
        maxidleSwap:Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象转移到Session Store中,该Session将不在内存中。
        maxidleBackup: Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象备份到Session Store中,但该Session对象依然存在内存中。
        <Store>指定实现持久化的类和Session存放的文件位置,如该例子中指定的类是:org.apache.catalina.session.FileStore,而Session对象存放的目录则是tomcat根目录下的 session文件夹(当然自己创建)

 

    4.启动Tomcat

        4.1 打开浏览器,访问Servlet,打印Session(浏览器不要关闭)。

        4.2 进入配置文件配置的Session存放目录,现在里面没有文件

        4.3 重启Tomcat,进入到Session存放目录,里面有一个${sessionId}.session的文件,这里保存的session信息。

        4.4 再次访问Servlet,发现打印出的SessionID和上一次一样。

 

    5. Question And Answer:

        5.1 Q:为什么两次访问要在一个浏览器,且不能关闭?

              A:因为在浏览器的Cookie保存了一个SessionId,请求访问服务器时会通过SessionID找到正确的Session信息。

        5.2 Q:为什么我重启后没有生成${sessionId}.session的文件

              A:首先你要保证你是正常退出Tomcat的,使用shutdown.sh 并不能保证一定关闭了tomcat,你可以使用ps -ef | grep tomcat查看进程是否存在,如果存在,就是Tomcat还未退出,这时使用kill -15 ${PID}来杀掉进程,Tomcat退出。注意:不能使用kill -9 ,因为这是强制退出,命令发出后,Tomcat还未将Session持久化到文件,进程久已经关闭了。

        5.3 Q:为什么保存到的Session的对象一定要序列化

              A:因为需要保存到文件里面

 

二、将Session持久化到Redis

      1.还是使用上一个WEB工程。

      2.启动Redis服务器,使用默认端口6379

src /redis-server --port 6379

      3.启动Redis客户端,连上刚刚启动的服务器

src /redis-cli -p 6379

      4.查看当前Redis的数据

keys *

      5.配置Tomcat持久化Session到Redis需要的jar (版本不对可能会报classNotFoundException,我开始用commons-pool-2.3.jar,jredis-1.0rc.jar,都不行)

       commons-pool-1.6.jar,

       jedis-2.1.0.jar

       tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar

       讲上面三个jar放到tomcat的lib目录下

   

      6.配置Tomcat'的content.xml文件,详情如下

< Context >
     <!-- Default set of monitored resources -->
     < WatchedResource >WEB-INF/web.xml</ WatchedResource >
     <!-- Uncomment this to disable session persistence across Tomcat restarts -->
     <!--
     <Manager pathname="" />
     -->
 
     <!--  Session持久化到文件的配置
     <Manager className="org.apache.catalina.session.PersistentManager">
         debug=0
         saveOnRestart="true"
         maxActiveSession="-1"
         minIdleSwap="-1"
         maxIdleSwap="-1"
         maxIdleBackup="1"
     <Store className="org.apache.catalina.session.FileStore"
            directory="/Users/Minutch/tomcatSession"
            />
     </Manager>
     -->
     
     < Valve className = "com.radiadesign.catalina.session.RedisSessionHandlerValve" />
     <!--Redis配置-->
     < Manager className = "com.radiadesign.catalina.session.RedisSessionManager"
                    host = "localhost"
                    port = "6379"
                    database = "0"
                    maxInactiveInterval = "10"
     />
 
     <!-- Uncomment this to enable Comet connection tacking (provides events
          on session expiration as well as webapp lifecycle) -->
     <!--
     <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
     -->
</ Context >

        7.启动Tomcat,打开浏览器,访问Servlet,打印SessionId

        8.查看当前的Redis的内容 keys *,发现多了一个以SessionId为key的键值对

                 

         9.重启Tomcat,再次访问Servlet(假设浏览器未关闭过),查看打印出来的SessionId,和上次一致。服务器的Session并未因为Tomcat重启而丢失Session

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值