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;