CAPTCHA是一种程序,可以生成人类可以通过的测试并对其进行评分,而计算机程序“ 不能 ”通过。 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用户应在输入区域中书写文本。 如果显示的文字与用户输入的文字相同,则我们可以“ 确保 ”有人在计算机上。
验证码示例:
验证码有几种用于实际安全性的应用程序,例如:
- 在评论字段中防止垃圾邮件 。
- 防止大量用户注册 。
- 防止字典攻击 。
- …
这些失真的文本的获取方式如下:
- 数字化实体书籍/报纸。
- 页面经过摄影扫描,然后使用“ 光学字符识别 ”(OCR)转换为文本。
- OCR不是完美的,即不能由OCR正确地读取被放置在图像上并且用作CAPTCHA每个单词。
- OCR无法正确读取的单词会与另一个已知答案的单词一起提供给用户。 然后要求读取两个单词,如果用户解决了答案已知的单词,则系统认为他们的答案对于新单词是正确的。 然后,系统将新图像提供给其他许多人,以便更有把握地确定原始答案是否正确。
现在您知道了验证码的工作原理,问题是,如果您想在网站上使用验证码 ,则应该实施上述过程,这当然并不容易,而且繁琐的工作需要数字化处理。 因此,有些“验证码提供商 ”已经为我们完成了这项工作。 这些提供商之一是reCaptcha http://www.google.com/recaptcha 。 reCaptcha是一项免费的验证码服务,可向我们提供这些验证 码 ,可在我们的网站中使用。 作为开发人员,我们只需要在客户端嵌入一段代码以显示验证码图像和文本区域,在服务器端嵌入一段代码即可调用用于解析输入数据的函数。 reCaptcha提供了用于处理许多编程语言(如Java , PHP , Perl …)的插件。
这篇文章将指导您如何在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);}
结果变量是传递给类型BindingResult的submitForm的属性。 当然,应使用<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