在Spring MVC Web应用程序中使用reCaptcha

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

验证示例:

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值