Java Spring3MVC请求验证

Java Spring3MVC请求验证,java,spring,rest,model-view-controller,Java,Spring,Rest,Model View Controller,我有一个Spring3.2应用程序,我创建了一个RESTAPI,它使用基于令牌的安全性。每个RESTJSON负载都包含一个用于执行安全验证的“令牌”字段 控制器方法如下所示: @RequestMapping(value = "/something", method = RequestMethod.POST) public @ResponseBody Map something(@RequestBody SomethingParams params) { } 其中SomethingParams有

我有一个Spring3.2应用程序,我创建了一个RESTAPI,它使用基于令牌的安全性。每个RESTJSON负载都包含一个用于执行安全验证的“令牌”字段

控制器方法如下所示:

@RequestMapping(value = "/something", method = RequestMethod.POST)
public
@ResponseBody
Map something(@RequestBody SomethingParams params) {
}
其中SomethingParams有一个
标记
字段,由Spring从请求的JSON主体自动填充

是否有一种方法可以自动在所有控制器方法上调用验证器,以检查诸如SomethingParams之类的参数是否具有有效的令牌


以前我使用了一个拦截器,并且令牌包含在查询字符串中,但是现在,由于它位于请求体中,我必须解析拦截器中的JSON才能检查它。由于Spring已经解析JSON来绑定参数,我很好奇是否有更聪明的方法。理想情况下,只需使用一些全局或控制器级别的设置(不是每个方法)。

您可以使用spring
验证器来处理此类情况

@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");
    }
  }
}
最后,您只需在
SomethingParams
对象上添加
@Valid
注释,即可对其进行验证

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

您可以使用标记字段创建基类,标记字段用
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实现自动验证参数

我通常用作实现提供者:

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

org.hibernate
休眠验证器
5.0.1.最终版本

您还可以实现自己的
特性
,它将拦截所有控制器方法并验证参数。这将使您有机会摆脱
@Valid
注释。
但不幸的是,我没有时间完整地介绍示例。

有没有办法避免在每个方法上使用@Valid注释?比如在parameters类中指定它?
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.1.Final</version>
</dependency>