使用 Thymeleaf 和 JQuery AJAX 通过 Java Spring MVC 实现 Antibot Captcha

Implement Antibot Captcha with Java Spring MVC using Thymeleaf and JQuery AJAX

我正在尝试使用我的 Spring MVC 应用程序实施验证码。虽然有一些如何做到这一点的例子,但我找不到任何使用 JQuery AJAX 提交表单并且模板引擎是 Thymeleaf 的地方。

我的主要信息来源是this

我已经添加了依赖项和 servlet,但我正在努力处理模板部分(我正在使用 Thymeleaf 和 JQuery AJAX 将我的表单发送到控制器)并在控制器中进行验证。

我不一定要使用 Captcha 作为我的反机器人框架,所以如果您有任何使用其他框架的想法,我将非常高兴听到他们。

好的,所以我最终使用了 Cage Captcha generator。它可以与 Maven 集成,并且很容易通过 Spring MVC 应用程序 JQuery AJAX.

实现
/**
 * Generates captcha as image and returns the image path
 * stores the captcha code in the http session
 * and deletes older, unused captcha images.
 */
@RequestMapping(value = "/captcha/generate", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public ResponseEntity<CaptchaRequestData> generateCaptcha(HttpSession session) {
    String captchaImageUploadDirectory = environment.getProperty("captcha_image_folder");
    String captchaWebAlias = environment.getProperty("captcha_web_alias");

    //Creating dir or making new one if it doesn't exist
    File file = new File(captchaImageUploadDirectory);
    if (!file.exists()) {
        try {
            file.mkdirs();
        } catch(Exception e){}
    }

    String timeSuffix = DBUtils.getDateTimeAsString();
    String fileName = CAPTCHA_IMAGE_PREFIX + timeSuffix + "." + CAPTCHA_IMAGE_EXTENSION;
    String fullFilename = captchaImageUploadDirectory + fileName;

    //Generating the captcha code and setting max length to 4 symbols
    Cage currGcage = new YCage();
    String captchaToken = currGcage.getTokenGenerator().next();

    if (captchaToken.length() > CAPTCHA_CODE_MAX_LENGTH) {
        captchaToken = captchaToken.substring(0, CAPTCHA_CODE_MAX_LENGTH).toUpperCase();
    }

    //Setting the captcha token in http session
    session.setAttribute("captchaToken", captchaToken);

    try {
        OutputStream os = new FileOutputStream(fullFilename, false);
        currGcage.draw(captchaToken, os);
        os.flush();
        os.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    deleteFilesOlderThan(captchaImageUploadDirectory, CAPTCHA_IMAGE_LIFE_MILLISECONDS, CAPTCHA_IMAGE_EXTENSION);

    CaptchaRequestData data = new CaptchaRequestData(captchaWebAlias + fileName);

    return new ResponseEntity<>(data, HttpStatus.OK);
}

然后当我创建对象时,我检查给定代码是否等于存储在会话中的代码:

 if (!httpSession.getAttribute("captchaToken").equals(bindingData.getCaptchaCode())) {
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
 }

最后,如果提供的验证码不正确,我会生成一个新的。