2014-10-17 45 views
0

我願意加入類似JSR303的驗證,它會知道相關的HttpServletRequest用HttpServletRequest感知的Spring JSR303-like驗證

例如,重新驗證碼需要發送的用戶IP是誰解決CAPTCHA一起與挑戰,響應和,我需要這樣的東西HttpServltRequest.getRemoteAddr(),所以對於驗證表單,包含驗證碼與批註/對應的驗證透明的控制器(比如,用類似@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之前就有一點行爲,在請求數據綁定到對象之前似乎正在發生。

回答

0

看起來像我已經找到了可用的東西:

在控制器」類中,添加

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

@InitBinder -annotated方法將每個控制器@RequestMapping - 方法之前被調用。您可以通過提供作爲註釋值的模型屬性名稱列表來改進此選擇。

ReCaptchaValidator只是實現了org.springframework.validation.Validator接口。

參數,這可能在該@InitBinder -method被使用的是,作爲文檔說,類似於@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.