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:
這需要一個作爲第一參數的遠程IP地址。但在我的驗證程序中,我似乎無法訪問HttpServletRequest對象。
我怎樣才能得到我的驗證器中的客戶端的IP地址?或者,有沒有更好的方法來實現這一目標?
用cdi bean框架插入httpservletrequest工作得很好。我正在使用tomcat 7進行焊接。有點難以配置,但是一旦我排除了我的pom.xml中的javax.el,它沒有任何問題。現在我可以簡單地使用@Inject HttpServletRequest請求;獲取請求對象。謝謝! – TinusSky