使用 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);
}
最后,如果提供的验证码不正确,我会生成一个新的。
我正在尝试使用我的 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);
}
最后,如果提供的验证码不正确,我会生成一个新的。