Я пытаюсь проверить капчу (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 вызова:
Этот параметр требует в качестве первого параметра удаленного IP-адреса. Но в моем валидаторе я, похоже, не имею доступа к объекту HttpServletRequest.
Как я могу получить IP-адрес клиента в моем валидаторе? Или, может быть, лучший способ добиться этого?
Вставка httpservletrequest с картой cdi bean работает очень хорошо. Я использую сварку с tomcat 7. Немного сложно настроить, но как только я исключил javax.el в моем pom.xml, он работал без проблем. Теперь я могу просто использовать запрос @Inject HttpServletRequest; для получения объекта запроса. Благодаря! – TinusSky