我有一个带参数bean的Servlet。 bean有一些字段应该无法被用户get-query覆盖。
我怎样才能实现它?
以下任何一项均无效:
@JsonIgnore
@XmlTransient
@JsonIgnoreProperties
private String somefield;
执行命令
localhost:8080/myservlet?somefield=xxx
这将直接改变财产。我怎么能告诉spring跳过那个属性?
甚至更好:当用户试图更改不允许的属性时,让spring拒绝请求?
答案 0 :(得分:3)
如果通过 servlet 表示控制器,则可以配置binder以忽略模型类的某些属性:
@RestController
public class MyServlet {
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("somefield");
}
@GetMapping("/myservlet")
public String myservlet(Model model) {
return model.toString();
}
}
型号:
public class Model {
private String somefield;
private String property2;
//getters and setters
}
另一种方法是从模型类中删除被忽略的属性setter。在这种情况下,spring将无法设置该值。
如果通过 servlet 表示 servlet ,则只需包装请求,不包括忽略来自getParameterMap()
调用的属性。
<强>更新强>
如果要在设置了不合适的属性时强制spring拒绝整个请求,则可以为此属性注册自定义属性编辑器,并在setValue方法中抛出异常。像这样:
@InitBinder
private void initBinder(WebDataBinder binder) {
// binder.setDisallowedFields("property1");
binder.registerCustomEditor(String.class, "somefield", new PropertyEditorSupport() {
@Override
public void setValue(Object value) {
throw new IllegalStateException();
}
});
}
另一种方法是在Model
类的属性设置器中抛出异常。 Spring然后捕获它,包装到它自己的org.springframework.validation.BindException
并返回400 bad request
。