idea的使用---Tomcat重启后,session无法活化

如题,写一个小案例时,定义了一个Bean类实现了Serializable和HttpSessionActivationListener接口,并重写sessionWillPassivate()和sessionDidActivate()方法:(解决方法在最后)

public class Bean02 implements Serializable,HttpSessionActivationListener {
    private String name;
    public Bean02() {
    }
    public Bean02(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Bean02{" +
                "name='" + name + '\'' +
                '}';
    }
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("Bean02被钝化了...");
    }
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("Bean02被活化了...");
    }
}

 正常关闭tomcat服务器,session钝化了:

Using CATALINA_BASE:   "C:\Users\Administrator\.IntelliJIdea2018.1\system\tomcat\_webDemo"
Using CATALINA_HOME:   "D:\Develop\Tomcat\apache-tomcat-8.0.53"
Using CATALINA_TMPDIR: "D:\Develop\Tomcat\apache-tomcat-8.0.53\temp"
Using JRE_HOME:        "D:\Develop\Java\jdk1.8.0_181"
Using CLASSPATH:       "D:\Develop\Tomcat\apache-tomcat-8.0.53\bin\bootstrap.jar;D:\Develop\Tomcat\apache-tomcat-8.0.53\bin\tomcat-juli.jar"
03-Feb-2019 12:43:03.625 信息 [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
03-Feb-2019 12:43:03.625 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-apr-8080"]
03-Feb-2019 12:43:03.682 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-apr-8009"]
03-Feb-2019 12:43:03.733 信息 [main] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina
Bean02被钝化了...
03-Feb-2019 12:43:03.773 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-apr-8080"]
03-Feb-2019 12:43:03.846 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-apr-8009"]
03-Feb-2019 12:43:03.900 信息 [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-apr-8080"]
03-Feb-2019 12:43:03.901 信息 [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-apr-8009"]
Disconnected from server

 Using CATALINA_BASE:   "C:\Users\Administrator\.IntelliJIdea2018.1\system\tomcat\_webDemo",去这个文件目录看一眼:

多了一个SESSIONS.ser文件,就是session钝化后生成的文件

下面问题就来了,按理说再次启动tomcat服务器,应该加载session信息到浏览器,调用 sessionDidActivate()这个方法,并且在页面中能获取到这个session中存的值,但是实际情况出入很大.

再次启动后,没有调用 sessionDidActivate()方法,浏览器端也获取不到重启前存入的对象.

于是我盯着这个SESSIONS.ser来回重启Tomcat好几次,发现每次重启Tomcat,Using CATALINA_BASE:   "C:\Users\Administrator\.IntelliJIdea2018.1\system\tomcat\_webDemo"这个目录下的work目录都要删除然后重新生成,而SESSIONS.ser这个文件也存在这个目录中,每次重启都会删除掉,当然无法活化了

解决方法:

在${TOMCAT_HOME}/conf 下的context.xml文件的Context节点下添加以下内容:

<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true">
    <Store className="org.apache.catalina.session.FileStore" directory="D:\Develop\Tomcat\apache-tomcat-8.0.53\conf\Session"/>
</Manager>

 directory="xxx\xxx\..."是序列化后的文件存储路径,自己定义即可

修改完配置文件后,再次启动tomcat,访问存session的页面,之后正常关闭,和之前一样,调用了sessionWillPassivate()方法.

再次启动tomcat,这一次启动时成功调用了sessionDidActivate()方法,并且在页面中可以获取到session中存储的Bean对象:

Using CATALINA_BASE:   "C:\Users\Administrator\.IntelliJIdea2018.1\system\tomcat\_webDemo"
Using CATALINA_HOME:   "D:\Develop\Tomcat\apache-tomcat-8.0.53"
Using CATALINA_TMPDIR: "D:\Develop\Tomcat\apache-tomcat-8.0.53\temp"
Using JRE_HOME:        "D:\Develop\Java\jdk1.8.0_181"
Using CLASSPATH:       "D:\Develop\Tomcat\apache-tomcat-8.0.53\bin\bootstrap.jar;D:\Develop\Tomcat\apache-tomcat-8.0.53\bin\tomcat-juli.jar"
03-Feb-2019 13:54:43.202 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library 1.2.17 using APR version 1.6.3.
03-Feb-2019 13:54:43.202 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
03-Feb-2019 13:54:44.280 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized (OpenSSL 1.0.2o  27 Mar 2018)
03-Feb-2019 13:54:44.480 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-apr-8080"]
03-Feb-2019 13:54:44.500 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-apr-8009"]
03-Feb-2019 13:54:44.500 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1921 ms
03-Feb-2019 13:54:44.540 信息 [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina
03-Feb-2019 13:54:44.540 信息 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.0.53
03-Feb-2019 13:54:44.570 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
03-Feb-2019 13:54:44.610 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
03-Feb-2019 13:54:44.620 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 122 ms
Connected to server
[2019-02-03 01:54:44,786] Artifact listenerDemo:Web exploded: Artifact is being deployed, please wait...
03-Feb-2019 13:54:45.186 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used.
[2019-02-03 01:54:45,436] Artifact listenerDemo:Web exploded: Artifact is deployed successfully
[2019-02-03 01:54:45,436] Artifact listenerDemo:Web exploded: Deploy took 650 milliseconds
Bean02被活化了...

 ps:Eclipse和idea不同,直接在${TOMCAT_HOME}\work\Catalina\localhost\项目名称中生成SESSIONS.ser,重启tomcat就能实现活化的功能,无需以上的这些设置.

 问题解决!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值