【问题标题】:How to hide @RequestMapping parameter?如何隐藏@RequestMapping 参数?
【发布时间】:2017-07-07 14:05:17
【问题描述】:

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

我怎样才能实现它?

以下方法均无效:

@JsonIgnore
@XmlTransient
@JsonIgnoreProperties
private String somefield;

运行:

localhost:8080/myservlet?somefield=xxx

这将直接改变属性。我如何告诉 spring 跳过该属性?

或者更好:让 spring 在用户尝试更改不允许的属性时拒绝请求?

【问题讨论】:

  • 你考虑过声明为final吗?
  • 我用来自注入的@Value 参数的值覆盖了类之外的那些字段。所以不能在请求中使它们成为最终的。
  • 啊,好的,我明白了。
  • 请参阅下面的链接,这可能对您有所帮助。 stackoverflow.com/a/11294332/2935802

标签: java spring spring-mvc jackson


【解决方案1】:

如果 servlet 您的意思是 controller,您可以配置 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
}

另一种方法是从模型类中删除被忽略的属性设置器。在这种情况下,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

【讨论】:

  • 好的,忽略参数。但是,如果有人尝试通过 get-query 设置这些参数,是否有可能抛出异常?
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 2021-09-01
  • 2013-03-30
  • 1970-01-01
  • 2019-07-16
  • 2014-01-24
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多