【问题标题】:Implement Antibot Captcha with Java Spring MVC using Thymeleaf and JQuery AJAX使用 Thymeleaf 和 JQuery AJAX 使用 Java Spring MVC 实现 Antibot Captcha
【发布时间】:2016-11-03 13:46:54
【问题描述】:

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

我的主要信息来源是this

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

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

【问题讨论】:

  • 你能分享一下你目前有什么吗?

标签: ajax spring-mvc thymeleaf captcha anti-bot


【解决方案1】:

好的,所以我最终使用了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);
 }

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

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 2016-09-08
    • 2015-11-25
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多