Spring MVC 3 - 将参数绑定到后备对象

时间:2010-02-09 20:24:55

标签: java validation spring spring-mvc

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

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

例如,我的用户对象有userName,而且还有points。当他们点击修改用户时,我希望他们能够更改userName,而不是points。恶意用户可以通过编辑HTML在表单中发送额外的points=429429作为隐藏字段,这将由Spring自动绑定到后备对象。

2 个答案:

答案 0 :(得分:4)

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

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);

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

希望这有帮助

答案 1 :(得分:4)

将此添加到您的控制器:

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