2013-11-24 1 views
0

Я пытаюсь проверить капчу (ReCaptcha), используя спящий режим валидатор, я написал аннотацию:Captcha validator; 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 с весной существует поддержка вложения зависимостей в валидаторы ограничений, которые должны быть полезны здесь.

+0

Вставка httpservletrequest с картой cdi bean работает очень хорошо. Я использую сварку с tomcat 7. Немного сложно настроить, но как только я исключил javax.el в моем pom.xml, он работал без проблем. Теперь я могу просто использовать запрос @Inject HttpServletRequest; для получения объекта запроса. Благодаря! – TinusSky

Смежные вопросы