1

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

这是我的代码示例

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

例如,在我的表单中,我显示了用于更新的姓名和电子邮件,因此当我在提交后更新我的人员属性时,人员的密码属性获取值为 null,但是当我将属性密码放在<s:hidden>表单中的标记中时,更新工作正常。

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

4

2 回答 2

1

如果您需要存储以下信息

  • 必须在请求中保持不变;
  • 不得在页面中显示;

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


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

您应该在您的 Web 应用程序中创建一个登录页面,仅在该操作中处理密码,根据数据库(或其他)验证它,并在 Session 中存储一些身份验证 ID,而不是密码本身(您不会验证用户同样,除非会话过期,否则用户将被重定向到登录页面......无需将密码保存在内存中)。


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

您应该使用一些单向散列算法添加盐以防止Rainbow Tables 攻击)来散列密码,并根据数据库上的散列密码检查它。这样,即使是数据库管理员也无法知道用户的密码,一旦忘记密码,密码将被重置,而不是被找回。

在 Java 中,最好的实现之一是基于BCrypt的jBCrypt

希望有帮助...


编辑

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

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

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

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

于 2013-02-04T09:20:38.150 回答
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#)中。我走这条路

于 2013-02-04T02:25:50.260 回答