更新对象属性
我正在使用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#)。 我继续这样