春季3 MVC请求验证(Spring 3 MVC request validation)

2019-09-03 03:11发布

我有一个Spring 3.2的应用程序,我已经创建了一个使用基于令牌的安全性REST API。 每个REST JSON有效载荷包含用于执行安全验证“令牌”字段。

控制器方法是这样的:

@RequestMapping(value = "/something", method = RequestMethod.POST)
public
@ResponseBody
Map something(@RequestBody SomethingParams params) {
}

其中SomethingParams具有token字段,并且通过弹簧从请求的JSON体自动填充。

有没有一种方法可以自动调用的所有控制器方法验证检查参数,如SomethingParams有一个有效的凭证吗?

以前我用了一个拦截器,并且令牌被列入查询字符串,但现在,因为它是在请求的身体,我将不得不解析JSON的拦截器,以检查它。 由于春天已经解析JSON绑定参数,我很好奇,如果有一个更聪明的方法。 理想情况下只是一些全局或控制器级别设置(不是每个方法)。

Answer 1:

您可以使用弹簧Validator了这样的情况。

@Component
public class SomethingParamsValidator implements Validator {
  @Override
  public boolean supports(Class<?> clazz) {
    return clazz.isAssignableFrom(SomethingParams.class);
  }

  @Override
  public void validate(Object o, Errors errors) {
    SomethingParams sp = (SomethingParams)o;
    validateToken(sp.getToken(), errors);
  }

  private void validateToken(String token, Errors errors) {
    if (!TokenUtils.isValid(token)) {
      errors.rejectValue("token", "foo", "Token is invalid");
    }
  }
}

然后您注册在你的Controller中加入以下方法

@Autowired
SomethingParamsValidator somethingParamsValidator;

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(somethingParamsValidator);
}

最后,所有你需要补充的是@Valid您的注释SomethingParams对象,它会被验证。

@RequestMapping(value = "/something", method = RequestMethod.POST)
public @ResponseBody Map something(@Valid @RequestBody SomethingParams params) {
    // ...
}


Answer 2:

你可以让基类与注释标记场JSR-303 @NotNull并从中延伸。

public class ParamsBase {
  @NotNull
  private String token;
  // getters, setters ...
}
public class SomethingParams extends ParamsBase {...}

然后只需用标记参数@Valid

@RequestMapping(value = "/something", method = RequestMethod.POST)
public @ResponseBody Map something(@Valid @RequestBody SomethingParams params) {
    // ...
}

Spring会自动验证与在运行时使用JSR-303实现的参数。

我通常使用的Hibernate验证为实现供应商:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.1.Final</version>
</dependency>


Answer 3:

您也可以实现自己的Aspect ,这将拦截所有控制器的方法和验证PARAMS。 这会给你机会摆脱@Valid注解。 但不幸的是我没有时间完全例子。



文章来源: Spring 3 MVC request validation