【问题标题】:Captcha validator; Client ip address in hibernate custom validator?验证码验证器;休眠自定义验证器中的客户端IP地址?
【发布时间】:2013-11-25 16:11:14
【问题描述】:

我正在尝试使用休眠验证器验证验证码(recaptcha),我已经编写了注释:

@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 地址?或者有没有更好的方法来实现这一点?

【问题讨论】:

    标签: java bean-validation hibernate-validator


    【解决方案1】:

    使用 Bean Validation 1.1 时,您可以创建一个 CDI bean,它提供对 servlet 请求对象的访问,并将该 bean 注入验证器。此外,当使用 Spring 的 Bean Validation 时,支持将依赖项注入到约束验证器中,这在这里应该会有所帮助。

    【讨论】:

    • 使用 cdi bean 框架插入 httpservletrequest 效果很好。我在tomcat 7中使用weld。配置有点困难,但是一旦我在pom.xml中排除了javax.el,它就可以正常工作了。现在我可以简单地使用@Inject HttpServletRequest 请求;获取请求对象。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多