2013-11-24 37 views
0

我試圖驗證使用Hibernate驗證驗證碼(驗證碼),我寫的註釋:驗證碼驗證碼;客戶端IP地址在Hibernate自定義驗證器中?

@Target({ TYPE, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = CaptchaCheckValidator.class) 
@Documented 
public @interface CaptchaCheck { 
    String message() default "{constraints.captchacheck}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    /** 
    * @return The first field 
    */ 
    String challenge(); 

    /** 
    * @return The second field 
    */ 
    String response(); 

    /** 
    * Defines several <code>@FieldMatch</code> annotations on the same element 
    * 
    * @see FieldMatch 
    */ 
    @Target({ TYPE, ANNOTATION_TYPE }) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List { 
     FieldMatch[] value(); 
    } 
} 

我的驗證:

public class CaptchaCheckValidator implements ConstraintValidator<CaptchaCheck, Object> { 
    private String challengeFieldName; 
    private String responseFieldName; 

    @Override 
    public void initialize(final CaptchaCheck constraintAnnotation) { 
     challengeFieldName = constraintAnnotation.challenge(); 
     responseFieldName = constraintAnnotation.response(); 
    } 

    @Override 
    public boolean isValid(final Object value, final ConstraintValidatorContext context) { 
     try { 
      final String challenge = BeanUtils.getProperty(value, challengeFieldName); 
      final String response = BeanUtils.getProperty(value, responseFieldName); 

checkAnswer(ip, callenge, response); 

問題就出在通話checkAnswer:

http://recaptcha4j.googlecode.com/svn-history/r3/trunk/apidocs/net/tanesha/recaptcha/ReCaptchaImpl.html#checkAnswer%28java.lang.String,%20java.lang.String,%20java.lang.String%29

這需要一個作爲第一參數的遠程IP地址。但在我的驗證程序中,我似乎無法訪問HttpServletRequest對象。

我怎樣才能得到我的驗證器中的客戶端的IP地址?或者,有沒有更好的方法來實現這一目標?

回答

1

使用Bean Validation 1.1時,您可以創建一個CDI bean,它提供對servlet請求對象的訪問並將此bean注入驗證器。另外,在Spring中使用Bean Validation時,還支持將依賴注入到約束驗證器中,這在這裏應該很有幫助。

+0

用cdi bean框架插入httpservletrequest工作得很好。我正在使用tomcat 7進行焊接。有點難以配置,但是一旦我排除了我的pom.xml中的javax.el,它沒有任何問題。現在我可以簡單地使用@Inject HttpServletRequest請求;獲取請求對象。謝謝! – TinusSky