使用HttpServletRequest认知的Spring JSR303类似验证

时间:2014-10-17 23:36:15

标签: java spring validation spring-mvc

我愿意加入类似JSR303的验证,这将验证相关的HttpServletRequest

例如,Re-Captcha要求发送正在解决CAPTCHa的用户的IP以及挑战和响应,为此我需要类似HttpServltRequest.getRemoteAddr()的内容,因此对于验证表单,包含带有注释/相应验证器的ReCAPTCHa透明地用于控制器(比如用@ReCaptcha注释POJO)我需要在验证层中使用这样的实例。

理想情况下,我想在

之间注入验证逻辑
[Http Servlet Request] -> [Jackson or similar data bind of request parts to POJO]

@RequestMapping("somewhere")
@ResponseBody
public Object login(@Valid @RequestBody LoginData loginData) {
    ...
}

呼叫。

存在哪些Spring工具来实现此类验证?

我发现HandlerInterceptor概念在形成HttpServletRequest之后,在形成{{1}}之后,在将请求数据绑定到对象之前就已经发生了一些动作。

1 个答案:

答案 0 :(得分:0)

看起来我发现了一些可用的东西:

在控制器' class,添加

@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
    binder.addValidators(new ReCaptchaValidator(request));
}

这个@InitBinder - 带注释的方法将在每个控制器@RequestMapping - 方法之前调用。您可以通过提供要触发的模型属性名称列表作为注释值来优化此选择。

ReCaptchaValidator仅仅是org.springframework.validation.Validator界面的实现。

正如文档所述,可以在此@InitBinder - 方法中使用的参数类似于@RequestMapping控制器方法:

* <p>Such init-binder methods support all arguments that {@link RequestMapping}
* supports, except for command/form objects and corresponding validation result
* objects. Init-binder methods must not have a return value; they are usually
* declared as {@code void}.
*
* <p>Typical arguments are {@link org.springframework.web.bind.WebDataBinder}
* in combination with {@link org.springframework.web.context.request.WebRequest}
* or {@link java.util.Locale}, allowing to register context-specific editors.