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,&lt;param-value&gt; 被设置为客户端,所以我得到了

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 类可序列化并不总是足够的。您还需要确保其每个属性也是可序列化的。大多数标准类型,如StringLong 等都已经实现了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 有一个额外的功能优势:当会话过期或客户端打开太多视图时,它可以防止ViewExpiredExceptions。

【讨论】:

如果我使用客户端设置,CSRF 和网络钓鱼会怎样。 它是加密的/enctyptable。

以上是关于JSF 2.0 中的 STATE_SAVING_METHOD 参数是啥的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 中的国际化

JSF 2.0 和 selectManyListbox 中的生命周期问题

托管 bean 问题中的用户输入验证(JSF 2.0)

JSF 2.0 中的 STATE_SAVING_METHOD 参数是啥

JSF 2.0中的AJAX onSubmit验证

jsf 2.0 中的不可见评论? [复制]