如何隐藏@RequestMapping参数?

时间:2017-07-07 14:05:18

标签: java spring spring-mvc jackson

我有一个带参数bean的Servlet。 bean有一些字段应该无法被用户get-query覆盖。

我怎样才能实现它?

以下任何一项均无效:

@JsonIgnore
@XmlTransient
@JsonIgnoreProperties
private String somefield;

执行命令

localhost:8080/myservlet?somefield=xxx

这将直接改变财产。我怎么能告诉spring跳过那个属性?

甚至更好:当用户试图更改不允许的属性时,让spring拒绝请求?

1 个答案:

答案 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