JsfCaptcha:显示正确的验证码值
我正在尝试使用来处理脱机验证码验证。虽然有一种方法可以验证“用户输入的内容与验证码图像显示的内容相匹配”,但实际上我很难打印出服务器所声明的是正确的解决方案。我预计这是相当容易完成的,但就我的生活而言,我无法理解它。以下是我使用图书馆的方式:JsfCaptcha:显示正确的验证码值,jsf,captcha,Jsf,Captcha,我正在尝试使用来处理脱机验证码验证。虽然有一种方法可以验证“用户输入的内容与验证码图像显示的内容相匹配”,但实际上我很难打印出服务器所声明的是正确的解决方案。我预计这是相当容易完成的,但就我的生活而言,我无法理解它。以下是我使用图书馆的方式: import botdetect.web.jsf.JsfCaptcha; [...] @ManagedBean @RequestScoped public class MySampleBean implements Serializable {
import botdetect.web.jsf.JsfCaptcha;
[...]
@ManagedBean
@RequestScoped
public class MySampleBean implements Serializable {
private JsfCaptcha captcha;
private String captchaCode;
getters for above two fields
[...]
setters for above two fields
[...]
public boolean checkInputMatches() {
if (!this.captcha.validate(captchaCode)) {
return true;
}
return false;
}
}
方法checkInputMatches()演示库如何验证用户是否输入了正确的验证码解决方案。出于调试目的,我现在想做的是注销解决方案(如果用户输入了错误的值)。可能是这样的:
final String solution = captcha.getCorrectSolutionToCaptcha();
起初,我已经浏览了所有的公众获取者,但没有一个公开向我提供我需要的数据。在尝试了所有这些方法之后,我继续进行反编译,并试图找到一种能够提供这些数据的解决方案/方法
遗憾的是,JsfCaptcha类的基类扩展级别为5-6级,有许多受保护/私有方法。显然,对一些非常简单的东西进行一次非常乏味和不必要的搜寻
是否可以打印出正在验证的实际JsfCaptcha值 我最终通过修改生成的字节码解决了这个问题。我这样做是因为我找不到任何getter方法来访问实际的验证码解决方案。显然,这不是一个干净的解决方案,但这是一个解决方案,因为您只想调试代码,以确定输入的代码与后端服务器的代码不匹配的原因。现在,我将考虑这是一个解决方案,直到有一个更干净的替代方案不需要字节码操作。以下是我使用的版本的详细信息,这些版本是我成功使用的:
botdetect-4.0.beta3.5jar
botdetect-jsf20-4.0.beta3.5.jar
botdetect-servlet-4.0.beta3.5.jar
当执行checkInputMatches()方法以验证验证码时,此结构将在后端针对所述JAR执行:
Step 1: ( botdetect-jsf20-4.0.beta3.5.jar )
com.captcha.botdetect.web.jsf.JsfCaptcha ->
public boolean validate(String paramString)
Step 2: ( botdetect-servlet-4.0.beta3.5.jar )
com.captcha.botdetect.web.servlet.Captcha ->
public boolean validate(String paramString)
Step 3: ( botdetect-jsf20-4.0.beta3.5.jar )
com.captcha.botdetect.internal.core.CaptchaBase ->
public boolean validate(String paramString1, String paramString2, ValidationAttemptOrigin paramValidationAttemptOrigin, boolean paramBoolean)
Step 4: ( botdetect-jsf20-4.0.beta3.5.jar )
com.captcha.botdetect.internal.core.captchacode.CodeCollection ->
public final boolean a(String paramString1, String paramString2, Integer paramInteger, boolean paramBoolean, ValidationAttemptOrigin paramValidationAttemptOrigin)
Step 5: Observe $3 ( third argument from Step 4 ) to show the actual code.
下面是一张使用jdgui的照片,通过它我得出了以下结论:
考虑到这一点,下面是如何在使用javassits执行代码时打印出该值(我在Tomcat上使用javassist-3.18.1-GA.jar):
鉴于这一投入和挑战:
您会在日志中看到这样的消息:
Botdetect-DEBUG: entered-captcha: U33aZ; expected-captcha: U49a6;
@Kukeltje我现在已经更新了问题,尽可能详细。考虑到我正在寻找一个代码解决方案,这似乎并不明显的基础上的文档,这可能是详细的,因为我可以找到一个解决方案。
Botdetect-DEBUG: entered-captcha: U33aZ; expected-captcha: U49a6;