我使用Struts2,我的问题是我不想更新所有的对象属性,因为我得到了一些敏感数据。
这是我的代码示例
public class person {
private name;
private email;
private password;
}
例如,在我的表单中,我显示要更新的姓名和电子邮件,因此当我在提交后更新我的个人属性时,该人的密码属性的值为null,但当我将属性密码放在表单中的<s:hidden>
标记中时,更新工作正常。
如何在不使用表单中的隐藏标记的情况下让Struts2记住密码的值?
如果您需要存储
- 必须在请求中保持持久性
- 不得在页面中显示
然后您必须通过实现SessionAware
:来使用会话
也就是说,我不确定你是否应该存储用户密码,也不应该将密码与用户关联;
您应该在web应用程序中创建一个登录页面,仅在该操作中处理密码,根据数据库(或其他)对其进行验证,并在会话中存储一些身份验证id,而不是密码本身(您不会再次验证用户,除非会话过期,否则用户将被重定向到登录页面…无需将密码保存在内存中)。
也就是说,用户身份验证的最佳实践不鼓励根据数据库中存储的密码验证输入的密码;
您应该使用一些单向散列算法(添加salt以防止Rainbow Table
的攻击)来散列密码,并将其与数据库上的散列密码进行检查。这样,即使是数据库管理员也无法知道用户的密码,如果忘记了密码,则会重新设置密码,而不是检索密码。
在Java中,最好的实现之一是基于BCrypt的jBCrypt。
希望能有所帮助。。。
编辑
作为在概念上分离Web应用程序中处理的对象的一种方法,您可以使用两个不同的Bean:一个用于读取的"Full Bean",包含所有属性,另一个用于写入的"Subset Bean",只包含可能更改的属性。
例如,ID和密码不应更改。。。您可以从数据库中读取"Full",然后写入JSP,然后写入数据库中的"Subset"(除了在用户注册中,您将在其中写入完整内容)。。。
为了更容易理解,Full Bean是Dao
对象,正好映射数据库字段,而Subset Bean是一个Presentation
对象,您将通过只复制Dao对象中所需的属性来创建它。。。它们都是DTO,但具有两个不同的语义级别。
否则,只需将您的bean放入会话中,它就是一行代码,您就可以了。
您可以在服务器端检查"null"(或唯一值)值(如果为null,则表示:没有更改)。或者您可以使用此类进行更新请求
Public class person
{
protected name;
protected email;
}
Public class personNew: person // inherit from person
{
private password;
}
我不使用"Struts2",而是在我的Web应用程序(APS.NET C#)中使用。我走这条路