通过观察不难发现,这两个错误都是发生在“loading sessions from persistent storage”之时,也就是从持久化文件还原session的时候。我们都知道Tomcat能够在容器关闭时将session中的数据持久化到文件系统中,待容器重启时将其还原,但前提条件是保存在session中的数据类型均实现了java.io.Serializable接口,glassfish的 Servlet容器是基于Tomcat构建的,所以原理基本相同,而且Glassfish是默认开启session持久化的。
于是解决第一个问题的答案就有了:cn.beans.UserSession中的time属性是java.util.Date类型的,而Date没有实现 Serializable接口、所以只需创建一个Date的子类令其实现Serializable接口,并将time定义为该子类的对象即可。
而解决第二个问题就需要彻底保证所有保存在session中的数据都是序列化了的才行。当然如果不考虑session持久化就不需要这样做了,只需禁用session持久化功能即可,这一点上tomcat与glassfish略有不同:
1.Tomcat中禁用/启用session持久化:在Tomcat的配置文件server.xml中添加以下内容:
禁用持久化:
<context path="..." reloadable="..." docbase="..." workdir="...">
<manager classname="org.apache.catalina.session.StandardManager">
</manager>
</context>
启用持久化:
<context path="..." reloadable="..." docbase="..." workdir="...">
<manager classname="org.apache.catalina.session.PersistentManager" saveonrestart="true">
</manager>
</context>
2.Glassfish中禁用/启用持久化:Glassfish项目中都有名为sun-web.xml的文件,要禁用session持久化只需在该文件中进行以下配置
<sun-web-app>
<session-config>
<session-manager>
<manager-properties>
<property name="sessionFilename" value="" />
</manager-properties>
</session-manager>
</session-config>
</sun-web-app>
sessionFilename的值是用来指定一个自定义名称的文件来保存session数据的,而将其设为空值便能够取消session持久化的功能。