2011-12-12 73 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-在-共此-漏洞/ –