wicket执行会话序列化吗?

时间:2015-10-25 13:35:24

标签: java session servlets serialization wicket

假设有一个自定义会话类,它来自org.apache.wicket.authroles.authentication.AuthenticatedWebSession。技术上AuthenticatedWebSession实现Serializable接口。

但这是否意味着wicket实际执行会话序列化(可能在磁盘中)?或者,当内存不足时,servlet容器有责任进行这样的会话序列化吗?

2 个答案:

答案 0 :(得分:2)

Wicket仅对包含其组件的页面进行序列化。它没有序列化会话!

以下是关于Wicket的一些事实,这是很好理解的:

  • 几乎所有Wicket类都是可序列化的。
  • Wicket允许群集,因此需要可序列化的会话(在这种情况下,可以使用servlet容器共享,例如Tomcat群集中的Tomcat共享会话)。
  • Wicket会在需要存储有状态页面时绑定Servlet会话。
  • 默认情况下,Wicket使用基于用于页面的标准Java序列化的序列化程序。在WicketStuff项目中有基于Kryo和Fast-Serialize的序列化器
  • Wicket使用SessionStore,这是一个特殊对象,负责向/从http会话存储/恢复Wicket会话。默认实现是HttpSessionStore,但您可以实现自己的(实现ISessionStore接口并将其添加到Application单例中)。
  • 有状态的Wicket组件可以在单个请求中存活,因此它能够将它们序列化并存储在某个位置(在磁盘上或通过网络在服务器之间共享)。

答案 1 :(得分:2)

Wicket Session对象作为属性存储在HttpSession中。 复制http会话是Web容器的工作,因此将Session的所有属性序列化是一项工作。

如果会话在任何应用程序组件中保留为非瞬态引用,则Wicket将序列化会话 。应用程序开发人员可以使用https://github.com/apache/wicket/blob/297c4e51a925ef08c3ff903e4db26d2f910fe084/wicket-core/src/main/java/org/apache/wicket/core/util/objects/checker/SessionChecker.java来防止此类错误。