【问题】
在维护以前的老项目的时候,发现关闭-重启tomcat,一个单点登录jar中的类的会报错:
java.io.NotSerializableException:com.landray.sso.client.EKPSSOUserData
【调侃】
可是自己一直很纳闷儿的事,同样的代码,同样的操作方式,为什么我老是报这个错?而讲课老师同样的操作就没事了?我也是醉醉的啦~\(≧▽≦)/~(纯属闲扯)
言归正传啊,先解释一下为什么会出现这个问题?
【原因】
在说原因之前,先解释两个词:正常关闭,非正常关闭
正常关闭:就是指在停止tomcat服务时,点击该按钮,myeclipse tomcat——Stop server,等同于点击servers窗口的红色停止按钮,这两种都是属于正常关闭。(如下图:)
非正常关闭:指停止tomcat服务时,点击console窗口的红色按钮:如下图:
当重启服务时,我们需要停止原来的服务,而停止服务有两种方式:1·正常关闭,2·非正常关闭。非正常关闭就会导致session对象销毁,而正常关闭则不会销毁session对象。也就是说,如果我们使用第一种方式关闭,tomcat停止时,还保存着session资源,(目标文件com.landray.sso.client.EKPSSOUserData类,原来保存于session中,而现在存于硬盘的文件夹里)并完成在session中存着的类的序列化,而由于该目标类没有实现序列化的接口,所以在重启服务时,它会尝试自动恢复session,从而导致序列化和反序列化的异常。
【解决方案】
1·存在session中的类实现序列化接口:如下代码:
2·选择关闭方式为非正常关闭方式:即点击console窗口的红色按钮。
3·(前提:自己按照tomcat插件)
在apache-tomcat-7.0.63\conf\context.xml中添加如下内容,或者在apache-tomcat-7.0.63\conf\server.xml下添加context节点,在context节点下添加:如果在server.xml中添加则content,则contentx.xml中的会被覆盖,两者皆可。
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/>
再进行启动停止等操作,报如下的类似错误:
org.apache.catalina.session.PersistentManagerBase start
严重: No Store configured, persistence disabled
原因是添加的东东少添加了一点点儿。
解决办法:
修改刚才添加的 <Context>中<Manager> 元素:
将
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/>
改为:
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
差不多就是这些,我选择的是第一种方案,第一种和第二种都可方便的解决该问题。