JSF 2.0 中的 STATE_SAVING_METHOD 参数是啥
Posted
技术标签:
【中文标题】JSF 2.0 中的 STATE_SAVING_METHOD 参数是啥【英文标题】:What is STATE_SAVING_METHOD parameter in JSF 2.0JSF 2.0 中的 STATE_SAVING_METHOD 参数是什么 【发布时间】:2012-01-18 06:48:38 【问题描述】:我无法理解 web.xml 中这一行的作用是什么
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
我读到 NetBeans 默认是 client。我刚刚遇到一个问题,我的应用程序中有很多 bean,<param-value>
被设置为客户端,所以我得到了
java.io.NotSerializableException
错误,尽管我的 bean 是可序列化的(即它们实现了可序列化接口。)。我的 bean 在 @ViewScope 中。但是当我将其更改为服务器时,一切正常。为什么?我使用客户端和服务器时有什么区别。任何人都可以通过一个例子来解释我。
谢谢
【问题讨论】:
【参考方案1】:javax.faces.STATE_SAVING_METHOD
参数用于指定保存状态的位置。
如果您想在服务器上保存状态(这是 JavaServer Faces 参考实现中的默认设置),请将 param-value
值指定为 server
。
否则我们可以在param-value
中指定client
来保存客户端的状态。
如果状态保存在客户端,则将整个视图的状态渲染到页面的隐藏字段中。
【讨论】:
由于此错误foxglovesecurity.com/2015/11/06/…,请不要在客户端保存序列化的 ViewState【参考方案2】:java.io.NotSerializableException
这种异常通常在根本原因中有一条消息,显示未实现Serializable
的类的完全限定类名。您应该密切关注此消息以了解它正在谈论哪个类,然后让它相应地实现Serializable
。
通常,only 您的托管 bean 类可序列化并不总是足够的。您还需要确保其每个属性也是可序列化的。大多数标准类型,如String
、Long
等都已经实现了Serializable
。但是(自定义)复杂类型,例如嵌套 bean、实体或 EJB,也都应该是可序列化的。如果某些东西不能真正实现为Serializable
,例如InputStream
,那么您应该重新设计模型或使其成为transient
(请记住,反序列化后它将是null
)。
我使用客户端和服务器有什么区别
首先是一些背景资料:Why JSF saves the state of UI components on server?
主要的技术区别在于client
设置将整个视图状态作为javax.faces.ViewState
隐藏输入字段的值存储在生成的html 输出中,server
设置将其与会话一起存储在会话中唯一 ID,它又被引用为 javax.faces.ViewState
隐藏输入字段的值。
因此,设置为client
会增加网络带宽使用量但会降低服务器内存使用量,而设置为server
则相反。然而,设置为client
有一个额外的功能优势:当会话过期或客户端打开太多视图时,它可以防止ViewExpiredException
s。
【讨论】:
如果我使用客户端设置,CSRF 和网络钓鱼会怎样。 它是加密的/enctyptable。以上是关于JSF 2.0 中的 STATE_SAVING_METHOD 参数是啥的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2.0 和 selectManyListbox 中的生命周期问题