1

我正在尝试使用我的 Spring MVC 应用程序实现 Captcha。尽管有一些如何做到这一点的示例,但我找不到使用 JQuery AJAX 提交表单的任何地方,并且模板引擎是 Thymeleaf。

我的主要信息来源是这个

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

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

4

1 回答 1

0

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

/**
 * 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);
 }

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

于 2016-11-18T13:54:52.270 回答