CAPTCHA是一种程序,可以生成人类可以通过的测试并对其进行评分,而计算机程序“ 不能 ”通过。 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用户应在输入区域中书写文本。 如果显示的文字与用户输入的文字相同,则我们可以“ 确保 ”有人在计算机上。

验证示例:

验证码有几种用于实际安全性的应用程序,例如:

  • 在评论字段中防止垃圾邮件 。
  • 防止大量用户注册 。
  • 防止字典攻击 。

这些失真的文本的获取方式如下:

  1. 数字化实体书籍/报纸。
  2. 页面经过摄影扫描,然后使用“ 光学字符识别 ”(OCR)转换为文本。
  3. OCR不是完美的,即不能由OCR正确地读取被放置在图像上并且用作CAPTCHA每个单词。
  4. OCR无法正确读取的单词会与另一个已知答案的单词一起提供给用户。 然后要求读取两个单词,如果用户解决了答案已知的单词,则系统认为他们的答案对于新单词是正确的。 然后,系统将新图像提供给其他许多人,以便更有把握地确定原始答案是否正确。

现在您知道了验证码的工作原理,问题是,如果您想在网站上使用验证码 ,则应该实施上述过程,这当然并不容易,而且繁琐的工作需要数字化处理。 因此,有些“验证码提供商 ”已经为我们完成了这项工作。 这些提供商之一是reCaptcha http://www.google.com/recaptcha 。 reCaptcha是一项免费的验证服务,可向我们提供这些验证 ,可在我们的网站中使用。 作为开发人员,我们只需要在客户端嵌入一段代码以显示验证图像和文本区域,在服务器端嵌入一段代码即可调用用于解析输入数据的函数。 reCaptcha提供了用于处理许多编程语言(如JavaPHPPerl …)的插件。

这篇文章将指导您如何在Spring MVC Web应用程序中使用reCaptcha 。 该应用程序包含用于注册新用户的表格。 此表单包含一个验证码,用于避免机器人启动大规模注册攻击。

第一步是打开一个帐户来reCaptcha网站(您可以使用您的Google帐户或创建一个新帐户)。

输入后,转到我的帐户 - 添加新站点

然后在域框中,您应该编写将包含验证验证的域。 在此示例中,我输入了localhost并选中了在所有域上启用此键(全局键) 。 当然,这里提供的信息是用于测试海豚的,并且在生产环境中应该有所不同。 注册网站后,将提供两个密钥,即私钥 (XXXX)和公钥 (YYYY)。

在编码之前,让我展示一下reCAPTCHA挑战的基本生命周期。 该图来自reCaptcha网站:

第二步是创建一个Spring MVC应用程序,这里没有什么秘密,我将只解释reCaptcha集成中隐含的部分 。 除了SpringMVC依赖性之外,还应该添加recaptcha4j API

<dependency><groupId>net.tanesha.recaptcha4j<groupId><artifactId>recaptcha4j<artifactId><version>0.0.7<version><dependency>

recaptcha4j.jar是一个API ,它提供了一种在基于Java的网站上放置验证的简单方法。 该库包装了reCAPTCHA API

reCaptcha集成到表单中,需要进行两项修改:

  • 一个在客户端,用于连接到reCaptcha服务器并获得挑战
  • 服务器端的第二个服务器,用于连接到reCaptcha服务器以发送用户的答案,并返回响应。

客户端:

对于客户端侧的TAGFILE已创建封装的Recaptcha API的所有逻辑在一个单一的点,所以可以在所有JSP形式进行再利用。

<%@ tag import='net.tanesha.recaptcha.ReCaptcha' %><%@ tag import='net.tanesha.recaptcha.ReCaptchaFactory' %><%@ attribute name='privateKey' required='true' rtexprvalue='false' %><%@ attribute name='publicKey' required='true' rtexprvalue='false' %><%ReCaptcha c = ReCaptchaFactory.newReCaptcha(publicKey, privateKey, false);out.print(c.createRecaptchaHtml(null, null));%>

reCaptcha类需要在第一步中由reCaptcha提供的私钥 (XXXX)和公钥 (YYYY)。 方法createRecaptchaHtml (…)创建了一段html代码来显示挑战。 实际上,它会生成如下内容:

最后是带有表单和验证信息的JSP页面:

<%@ taglib uri='http:java.sun.comjspjstlcore' prefix='c' %><%@ taglib prefix='form' uri='http:www.springframework.orgtagsform' %><%@ taglib prefix='tags' tagdir='WEB-INFtags' %><%@ page session='false' %><html><head><title>Register User<title><head><body><h1><form:form id='register' modelAttribute='userInfo'><table><tr><td>Username: <td><td><form:input path='username'><td><tr><tr><td>Password: <td><td><form:password path='password'><td><tr><tr><td>Age: <td><td><form:input path='age'><td><tr><tr><td colspan='2'><tags:captcha privateKey='XXXX' publicKey='YYYY'><tags:captcha><td><tr><tr><td colspan='2'><input id='submit' type='submit' value='Submit' ><td><tr><table><form:form><h1><body><html>

看到形式被照常使用Spring MVC 标签库生成的,但也我们使用创建TAGFILE(<标签:验证码>)用于嵌入验证码成形式。

服务器端:

服务器端甚至比客户端更简单。 当使用createRecaptchaHtml创建验证码时,将创建两个表单元素字段, recaptcha_challenge_field包含有关向用户显示的质询的信息,而recaptcha_response_field包含用户对质询的答案。

除了这两个参数之外, recaptcha4j还需要远程地址。 ServletRequest接口对此海豚有一个方法( getRemoteAddr() )。

@RequestMapping(value='', method=RequestMethod.POST)public String submitForm(@ModelAttribute('userInfo') UserInfo userInfo, @RequestParam('recaptcha_challenge_field') String challangeField, @RequestParam('recaptcha_response_field') String responseField, ServletRequest servletRequest) {String remoteAddress = servletRequest.getRemoteAddr();ReCaptchaResponse reCaptchaResponse = this.reCaptcha.checkAnswer(remoteAddress, challangeField, responseField);if(reCaptchaResponse.isValid()) {return 'success';} else {return 'home'; }}

reCaptcha对象是使用Spring注入的。 请务必注意, UserInfo (用户以表单形式输入的数据)不包含有关验证码的任何信息,它仅包含“业务”数据。 使用@ RequestParam,reCaptcha信息由Spring检索,可以直接用于reCaptcha对象。

另一个重要的部分是isValid()方法。 此方法仅检查reCaptcha站点的响应是否表明用户已通过挑战。 因此,根据结果,您应该采取行动,如果未通过挑战,请返回上一页。

<bean id='recaptcha' class='net.tanesha.recaptcha.ReCaptchaImpl'><property name='privateKey' value='XXXX'><property><bean>

该bean定义仅用于使用您的私钥实例化reCaptcha类。 使用@Autowire将 bean注入controller中

第三步:

最后一步是观看创建的表单显示验证图像,控制器根据您在验证文本区域中输入的内容将您重定向到页面。

额外步骤:

现在,您已经有了关于如何使用reCaptcha的基本概念,下一步(超出本文的讨论范围)不是再次显示表单而没有任何错误消息,您可以在Controller中使用BindingResult来向用户通知错误消息:

if (!reCaptchaResponse.isValid()) {FieldError fieldError = new FieldError('userInfo','captcha','Please try again.');result.addError(fieldError);}

结果变量是传递给类型BindingResultsubmitForm的属性。 当然,应使用<form:errors path ='captcha'/>更改JSP以显示错误消息。

另一个改进是创建与验证码验证形成的HandlerInterceptor。 例如, ReCaptchaHandlerInterceptorAdapter将包含reCaptcha管理。 如果验证质询由用户正确解决(允许定义的控制器执行其工作),则preHandle方法将返回true,否则将返回false并重定向到错误页面。

<mvc:interceptors><mvc:interceptor><mapping path='*.form'><bean class='org.springsource.mvc.ReCaptchaHandlerInterceptorAdapter' ><mvc:interceptor><mvc:interceptors>

使用先前的处理程序配置,所有表格都将具有验证验证功能。

希望这篇文章对您有所帮助,现在您可以开始保护Web表单免受垃圾邮件或漫游器的侵害。 下载Eclipse Project 。

参考: MorniëUtúlië,相信,您将找到我们的JCG合作伙伴 Alex Soto (也许是Enya) ,在One Jar to Rulem All博客上找到了路。

翻译自: https://www.javacodegeeks.com/2012/11/use-recaptcha-in-a-spring-mvc-web-application.html

在Spring MVC Web应用程序中使用reCaptcha相关推荐

  1. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

    如何使用recaptcha CAPTCHA是一个程序,可以生成人类可以通过但计算机程序" 不能 "通过的测试并对其进行评分. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用 ...

  2. 在Spring MVC Web应用程序中添加社交登录:集成测试

    我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但是它并不能真正告诉我们我们的应用程序是否正常运行. 这就是 ...

  3. 在Spring MVC Web应用程序中添加社交登录:单元测试

    Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...

  4. 集成spring mvc_向Spring MVC Web应用程序添加社交登录:集成测试

    集成spring mvc 我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但它并不能真正告诉我们我们的应用程 ...

  5. 将社交登录添加到Spring MVC Web应用程序:配置

    过去,用户使用用户名和密码组合登录. 尽管如今有些人仍然偏爱传统方式,但越来越多的用户希望使用其社交媒体帐户登录. 这就是使Spring Social(及其子项目)成为Spring项目组合有用的补充的 ...

  6. spring_在基于Spring的Web应用程序中使用Http Session

    spring 在基于Spring的Web应用程序中拥有和使用Http会话有多种方法. 这是基于最近项目经验的总结. 方法1 只需在需要的HttpSession中注入即可. @Service publi ...

  7. spring基于注释的配置_基于注释的Spring MVC Web应用程序入门

    spring基于注释的配置 这是使Maven启动Spring 3 MVC项目的最小方法. 首先创建spring-web-annotation/pom.xml文件,并包含Spring依赖项: <? ...

  8. gradle spring_使用Gradle的简单Spring MVC Web应用程序

    gradle spring 除了我们现在将使用Spring MVC而不是原始servlet之外,该文章将与我们之前的文章Simple Gradle Web Application相似. 使用Gradl ...

  9. 在基于Spring的Web应用程序中使用Http Session

    在基于Spring的Web应用程序中拥有和使用Http会话有多种方法. 这是基于最近项目经验的总结. 方法1 只需在需要的HttpSession中注入即可. @Service public class ...

最新文章

  1. 显卡不够时,如何训练大型网络
  2. vsftp匿名访问目录_vsftp 匿名访问设置设置
  3. Supervised Descent Method and its Applications to Face Alignment
  4. 大型运输行业实战_day12_1_权限管理实现
  5. 表单提交中文乱码_Java学习路线分享如何处理中文参数
  6. 【人脸识别】LFW数据集介绍
  7. 特朗普社交应用登苹果App Store下载量榜首
  8. Apache Struts ‘includeParams’安全绕过漏洞
  9. java 三个点_Java Object定义三个点如何实现 Java Object定义三个点实现代码
  10. centos7.5 mysql5.6_Centos7下完美安装并配置mysql5.6
  11. SSH免密码登录,搭建Flink standalone集群
  12. 实验室建立计量管理体系的重要性和意义
  13. 数独解法Java实现
  14. Lemp + Wordpress 快速搭建个人博客
  15. 微信公众号运营策划方案书之公众号基础知识
  16. Poi的Excel的导入导出 支持2007
  17. java重命名_java实现文件重命名的方法
  18. Android美化之全局透明背景
  19. OpenGL.ES在Android上的简单实践:11-全景(索引-深度测试)
  20. 利用python爬取历代中国行政图,从先周到中华人民共和国,jpg格式边框带经纬度,可自行配准矢量化

热门文章

  1. 10.1-控制单元CU的组合逻辑设计
  2. 转:微服务设计、拆分原则
  3. 我的控制反转,依赖注入和面向切面编程的理解
  4. MySQL存储过程+游标+触发器
  5. 最小生成树——Prim(普利姆)算法
  6. hibernate在saveOrUpdate时,update报错:a different object with the same identifier value was already assoc
  7. jep290涉及jdk版本_JDK 14 – JEP 361从预览中切换表达式
  8. jdk12 jdk1.8_JDK 12的Files.mismatch方法
  9. java 和javafx_Java,JavaFX的流利设计风格文本字段和密码字段
  10. php cdi_CDI中的事务异常处理