2016-11-03 51 views
0

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

我的主要信息来源是this

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

我不一定希望使用Captcha作为我的抗体框架,所以如果您有任何想法使用其他框架,我会非常乐意听到他们。

+0

你能分享到目前为止你有什么? – kenorb

回答

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

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