2011-12-12 72 views
40

STATE_SAVING_METHOD参数我无法理解什么是我看过的NetBeans的默认值是客户此行的web.xml中什么是JSF 2.0

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

功能。我刚刚遇到我有很多豆在我的应用程序的问题,以及<param-value>设置为客户端,所以我得到

java.io.NotSerializableException

错误,虽然我的豆可串行化(即它们实现了Serializable接口)。我的豆在@ViewScope。但是当我将它改为服务器时,事情就会起作用。为什么?我使用客户端和服务器时有什么不同。任何人都可以在示例的帮助下解释我。

感谢

回答

51
java.io.NotSerializableException 

这种异常通常有根本原因的消息,显示在没有实现Serializable类的完全限定类名。您应该密切关注此消息以了解它正在讨论哪个类,然后相应地执行Serializable

通常,只制作您的托管bean类可序列化并不总是足够的。您还需要确保的每个属性都是可序列化的。大多数标准类型,如String,Long等实施已经全部为Serializable。但是,(自定义)复杂类型(如嵌套的Bean,实体或EJB)也应该可序列化。如果Serializable之类的东西不是真正可实现的,例如InputStream,那么您应该重新设计模型或使其成为transient(并且请记住,在反序列化之后它将是null)。


有什么区别时,我使用的客户端和服务器

首先是一些背景资料:Why JSF saves the state of UI components on server?

主要技术区别是,client设置存储整个视图状态作为生成的HTML输出中的javax.faces.ViewState隐藏输入字段的值,并且server设置ing将其存储在会话中以及一个唯一的ID,该ID又被引用为隐藏输入字段的值。

因此,设置client增加了网络带宽的使用,但会降低服务器的内存使用情况和设置server不会反过来。然而,设置为client具有额外的功能优势:当会话过期或客户端打开太多视图时,它可以防止ViewExpiredException

+1

如果使用客户端设置,CSRF和Phishing如何? – Kayser

+1

它是加密/ encttabletable。 – BalusC

11

javax.faces.STATE_SAVING_METHOD参数用于指定应保存状态的位置。

如果要保存服务器上的状态(这是JavaServer Faces参考实现中的默认设置),请将param-value值指定为server

否则为了保存客户端的状态,我们可以在param-value中指定client

如果状态保存在客户端上,则整个视图的状态将呈现为页面上的隐藏字段。

+0

由于这个bug,不要在客户端保存序列化的ViewState http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-在-共此-漏洞/ –