更新对象属性

我正在使用Struts 2,我的问题是我不想更新所有对象属性,因为我得到了一些敏感数据。

这是我的代码示例

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

以我的forms为例,我显示了更新的名称和电子邮件,因此当我在提交后更新我的人员属性时,该人的密码属性获取值null,但是当我将属性密码放在标签中时在forms上更新工作正常。

如何让Struts 2记住密码的值而不使用表单中的隐藏标签?

如果你需要存储信息

  • 必须坚持要求;
  • 不得在页面中显示;

那么你必须通过实现SessionAware来使用Session :


也就是说,我不确定你应该存储用户密码,也不确定密码与用户的关联;

您应该在Web应用程序中创建一个登录页面,仅在该Action中处理密码,针对数据库(或其他)validation密码,并在Session中存储一些身份validationID,而不是密码本身(您不会validation用户)再次,除非会话到期,然后用户将被重定向到登录页面……不需要将密码保存在内存中)。


也就是说,用户身份validation的最佳实践不鼓励根据数据库中存储的密码validation输入的密码;

你应该使用一些单向散列算法 ( 添加一个盐来防止Rainbow Table的攻击)来散列密码,并根据数据库中的散列密码进行检查。 这样,即使数据库管理员也不知道用户的密码,并且在忘记密码的情况下,它将被重置,而不是被检索。

在Java中,有一个最好的实现是基于BCrypt的jBCrypt 。

希望有帮助……


编辑

作为从概念上分离您在Web应用程序中处理的对象的一种方法,您可以使用两个不同的bean:用于读取的“Full Bean”,具有所有属性,以及用于写入的“Subset Bean”,仅包含可能的属性更改。

例如,ID和密码不应该更改…您可以从数据库中读取“完整”,然后写入JSP,然后写入数据库“子集”(除了在用户注册中,您将在其中写满)。 ..

为了使其更容易理解,Full Bean是Dao Object映射到数据库字段,而Subset Bean是一个Presentation Object,您将通过仅复制Dao对象中的所需属性来创建…它们都是DTO ,但有两种不同的语义层次。

否则只需将你的bean放入会话中,它就是一行代码,你就可以了。

您可以在服务器端检查“null”(或唯一值)值(如果它为null,则表示:没有更改。)。 或者您可以使用此类进行更新请求

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

我不使用“Struts 2”,而是使用我的Web应用程序(APS.NET C#)。 我继续这样