【问题标题】:Spring MVC 3 - Binding parameters to backing objectSpring MVC 3 - 将参数绑定到支持对象
【发布时间】:2011-01-14 23:50:31
【问题描述】:

我正在尝试为我的User 对象设置一个编辑表单。我有从表单到用户对象的自动绑定工作正常。

我想知道如何防止恶意用户绑定到我不希望他们绑定的 User 对象的字段?

例如,我的用户对象有userName,它也有points。当他们单击编辑用户时,我希望他们能够更改userName,但不能更改points。恶意用户可以通过编辑 HTML 将额外的 points=429429 作为隐藏字段发送到表单中,然后 Spring 会自动将其绑定到支持对象。

【问题讨论】:

  • 查看您之前的问题,他们使用@InitBinder-annotated 方法对id 字段执行此操作:stackoverflow.com/questions/2232095/…
  • 好评论,@initbinder 就是我要找的东西。如果可以的话,我会接受它作为答案。

标签: java validation spring spring-mvc


【解决方案1】:

将此添加到您的控制器:

@InitBinder
protected void initBinder(WebDataBinder binder) {
 binder.setAllowedFields("field1", "field2");
}

【讨论】:

    【解决方案2】:

    我建议将您的前端代码与将保存在数据库中的内容的逻辑分开。表单支持对象只是一个简单的对象,它捕获用户在视图中所做的事情......它不应该用于直接保存到数据库。我会让服务层处理是否更新某些字段的决定......控制器应该只接收输入并将其传递。这样,服务可以决定应该更新哪些字段。

    public void updateUser(long userId, User updatedUser) {
        User currentUser = dao.getCurrentUserById(userId);
        currentUser.userName = updatedUser.username;
        //...... update anyother fields....
        dao.SaveUser(currentUser);
    }
    

    或者您可以以调用者知道将要更新的内容的方式定义方法:

    public void updateUser(long userId, String updatedUsername);
    

    我还认为,如果此逻辑位于服务层中,则单元测试会容易得多。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多