2013-02-04 167 views
1

我正在使用Struts 2,我的問題是我不想更新所有對象屬性,因爲我得到了一些敏感數據。更新對象屬性

這裏是我的代碼示例

public class person { 
    private name; 
    private email; 
    private password; 
} 

在我的形式存在,例如我顯示更新的姓名和電子郵件,所以當我更新提交後我一個人的屬性,人的密碼屬性獲取null值,但是當我以更新正常的形式在<s:hidden>標記中放置屬性密碼時。

如何讓Struts 2在不使用表單中的隱藏標記的情況下記住密碼的值?

回答

1

如果你需要存儲的信息是

  • 必須是跨請求持久的;
  • 不得在頁面中顯示;

那麼你必須use the Session,通過實施SessionAware


這麼說,我不知道你要存儲用戶密碼,也沒有關聯密碼的用戶;

您應該在您的Web應用程序中創建一個登錄頁面,僅處理該Action中的密碼,根據數據庫(或其他)驗證它,並將一些身份驗證ID存儲在Session中,而不是密碼本身t再次驗證用戶,除非會話過期,那麼用戶將被重定向到登錄頁面...無需將密碼保存在內存中)。


儘管如此也爲用戶身份驗證的最佳實踐勸阻驗證對數據庫存儲的密碼輸入的密碼;

您應該使用一些單向的hashing algorithmadding a salt以防止Rainbow Table的攻擊)散列密碼,並根據數據庫上的散列密碼進行檢查。這樣,即使數據庫管理員也不知道用戶的密碼,並且在忘記密碼的情況下,它將被重置,而不是被檢索。

在Java中,最好的實現之一是jBCrypt,基於BCrypt

希望可以幫助...


編輯

,以此來你在你的Web應用程序,你可以使用兩種不同的豆類處理對象的概念分開:一個「全豆」的閱讀,所有的屬性,用於書寫的「子集Bean」,僅包含可能改變的屬性。

例如,ID和密碼不應該改變...您可以從數據庫中讀取「完整」,然後寫入JSP,然後寫入數據庫「子集」(除了在用戶註冊中,您將寫入完整的)...

爲了使它更容易理解,Full Bean是Dao對象完全映射數據庫字段,而子集Bean是Presentation對象,您將通過僅複製所需的屬性Dao對象......他們都是DTO,但有兩種不同的語義層次。

否則只是把你的bean放在session中,它是一行代碼,你會沒事的。

+0

感謝您的回覆,我已經使用哈希算法和鹽我的問題是如何保持特性的值後更新而不是null,沒有使用會話,因爲在我的課我有很多屬性,我不想要用於更新表單 – user1655410

+0

您可以使用兩種不同的bean:用於閱讀的「Full Bean」,包含所有屬性,以及用於書寫的「子集Bean」,僅包含可能更改的屬性。例如,ID和密碼不應該改變......你可以從數據庫中讀取「Full」,然後寫入JSP,然後寫入數據庫「Subset」(除了用戶註冊,你將寫滿)。 ..否則只是把你的bean放在會話中,這是一行代碼,你會沒事的。 –

+0

謝謝你的解釋,我想我會做什麼。您應該將您的評論作爲答案。 – user1655410

0

您可以在服務器端檢查「null」(或唯一值)值(如果爲null,則表示沒有變化)。 或者你可以使用這個類的更新請求

Public class person 
{ 

    protected name; 
    protected email; 
} 
Public class personNew: person // inherit from person 
{ 
    private password; 
} 

我不使用 「的Struts 2」,但在我的web應用程序(APS.NET C#)。我走在這條路上