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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P1757 通天之分组背包

P1757 通天之分组背包 题目背景 直达通天路小A历险记第二篇 题目描述 自01背包问世之后&#xff0c;小A对此深感兴趣。一天&#xff0c;小A去远游&#xff0c;却发现他的背包不同于01背包&#xff0c;他的物品大致可分为k组&#xff0c;每组中的物品相互冲突&#xff0c;现在&a…

课时109.外边距合并现象(掌握)

我们先写一个案例&#xff0c;通过案例来了解 它们之间的水平距离就是两个间距的和 我们看完水平再来看垂直方向 在默认布局的垂直方向上&#xff0c;默认情况下外边距是不会叠加的&#xff0c;会出现合并现象&#xff0c;谁的外边距比较大就听谁的 本文转载于:猿2048➜https:…

纯 CSS实现三角形

最近项目上做评论回复&#xff0c;设计师提高交互性特意设计了小三角&#xff0c;如下&#xff1a; 下面介绍一下实现效果的css方法&#xff1a; 1.border 通过设置上下左右border宽度来实现。 首先查看一下全部设置的效果&#xff1a; <style>   .triangle{     w…

python access_Python3 os.access() 方法

Python3 os.access() 方法概述os.access() 方法使用当前的uid/gid尝试访问路径。大部分操作使用有效的 uid/gid, 因此运行环境可以在 suid/sgid 环境尝试。语法access()方法语法格式如下&#xff1a;os.access(path, mode);参数path -- 要用来检测是否有访问权限的路径。mode -…

小米的java待遇怎么样_【Java工资】小米2021年Java工资待遇-看准网

已经不是面试官迟到的问题了&#xff0c;是约好了面试时间&#xff0c;结果彻底没有然后了&#xff0c;这种言而无信我头一回见。小米运营部门令人困惑的工作作风&#xff0c;简单总结一句就是&#xff1a;敷衍不走心&#xff0c;面试规则内部都不统一。两次面小米&#xff0c;…

Spring MVC表单验证(带批注)

这篇文章提供了一个简单HTML表单验证示例。 它基于带有注释的Spring MVC示例。 该代码可在GitHub的Spring-MVC-Form-Validation目录中找到。 数据 在此示例中&#xff0c;我们将使用bean和JSR303验证批注&#xff1a; public class MyUser {NotNullSize(min1,max20)private …

课时106.边框练习(理解)

让我们做出来如下的样式&#xff1a; 1.首先看下有几个边框&#xff0c;就做几个div&#xff0c;用简单方法div.box$*6 tab键 2.然后给它们设置宽高 3.然后依此来做边框 第一个&#xff1a;有四种方法&#xff0c;第一种最简单 第二个&#xff1a;有两种方法&#xff0c;第二…

Bzoj3998 弦论

物理题目传送门 求第k大的子串&#xff1f;SAM模板题啊 CLJ的论文都讲了怎么做啊&#xff0c;把自动机看成一个后缀Trie求出size让后像多叉平衡树那样乱搞就好了~ 比前两个哈希的题好多了~ &#xff08;顺便&#xff0c;hdu高亮好好看啊&#xff09; #pragma GCC opitmize(&quo…

java需要先安装jdk_谢谢知乎。Java初学者首先下载 JDK 开发环境,然后再下 eclipse 对吗?那 tomcat是什么?还需要安装吗?...

程序猎人Till All are One!何马、FAN 等人赞同这个问题&#xff0c;作为有些Java经验的人&#xff0c;都会觉得太初级。而且&#xff0c;我认为可能很多真正的高手不屑于跑来回答这种问题。本来我也不打算回答的&#xff0c;但最近刚好凭兴趣在学Node.JS&#xff0c;顺便学习加…

JavaEE重新审视设计模式:装饰器

去年的这个时候&#xff0c;我写了一系列有关JavaEE实现设计模式的博客文章。 大约一年后&#xff0c;我意识到我错过了我最喜欢的图案装饰器。 装饰器模式基本上是通过装饰其他对象来扩展对象功能的方法&#xff0c;这些对象可以包装目标对象并为其添加自身的行为。 如果您从…

课时105.边框属性下(掌握)

2.3连写&#xff08;分别设置四条边的边框&#xff09; border-width:上 右 下 左; border-style:上 右 下 左; border-color:上 右 下 左; 注意点&#xff1a; 1.这三个属性的取值是按顺时针来赋值的 也就是按照上右下左来赋值&#xff0c;而不是按照日常生活…

怎么用pycharm更新python_利用PyCharm操作Github(仓库新建、更新,代码回滚)

Github是目前世界上最流行的代码存储和分享平台&#xff0c;而PyCharm是Python圈中最流行的IDE&#xff0c;它很好地支持了Git操作。本文将会介绍如何利用PyCharm来连接Github&#xff0c;同时演示Github上的仓库新建、更新&#xff0c;以及代码回滚。在这之前&#xff0c;需要…

新mac 下第一次 安装 mongodb 步骤

新入手mac&#xff0c;安装mongo步骤记录&#xff1a;不建议使用网上的brew安装方法&#xff0c;因为试了半天没有成功&#xff0c;应该是新版本限制比较多&#xff01; 从mongodb官网下载mac版本mongo&#xff1a; 1.访问MongoDB官方下载地址 http://www.mongodb.org/download…

201621123065《JAVA程序设计》第11周学习总结

1. 本周学习总结 2. 书面作业 1. 源代码阅读&#xff1a;多线程程序BounceThread 1.1 BallRunnable类有什么用&#xff1f;为什么代码中需要调用Thread.sleep进行休眠&#xff1f; BallRunnable类实现Runnable接口&#xff0c;支持多线程&#xff1b;调用Thread.sleep进行休眠则…

vue使用v-for循环,动态修改element-ui的el-switch

在使用element-ui的el-switch中&#xff0c;因为要用v-for循环&#xff0c;一直没有成功&#xff0c;后来仔细查看文档&#xff0c;发现可以这样写 <el-switch v-for"(item, key) in list" v-model"item.is" :key"key" :active-value"…

前端加按钮将图片另存为_Windows 10系统如何将自己的照片制作成文件夹图标

我们大家都在电脑上建有很多文件夹&#xff0c;有时候查找自己需要的资料文件夹时不太容易&#xff0c;很浪费时间。如果将自己的照片作为常用文件夹的图标&#xff0c;看起来醒目查找时也更为方便些。下面就介绍具体的操作教程。一、将照片格式转换为图标文件格式在电脑上将图…

codeforces 125 A-E 补题

A Measuring Lengths in Baden 进制转换 水题 #include<bits/stdc.h> using namespace std;int main() {int n;scanf("%d",&n);int an/36;n-a*36;int b(n)/3;if((n%3)>2)b;while(b>12)b-12,a1;printf("%d %d\n",a,b);return 0; }B Simple …

在JAXB解组期间应用名称空间

对于某些XML模式来说&#xff0c;它是一组严格的规则&#xff0c;用于规定XML文档的结构方式。 但是对于其他人来说&#xff0c;通常的准则是指出XML的外观。 这意味着有时出于某些原因人们希望接受不符合XML模式的输入。 在此示例中&#xff0c;我将演示如何利用SAX XMLFilter…

java怎么把文件写入到usb里_如何创建PowerShell脚本以将文件复制到USB闪存驱动器?...

此代码最后准备使用可移动驱动器(例如插入的USB驱动器)&#xff1a;$drives [System.IO.DriveInfo]::GetDrives()$r $drives | Where-Object { $_.DriveType -eq Removable -and $_.IsReady }if ($r) {return ($r)[-1]}throw "No removable drives found."这种方式…

利用css transition属性实现一个带动画显隐的微信小程序部件

我们先来看效果图 像这样的一个带过渡效果的小部件在我们实际开发中的应用几率还是比较大的&#xff0c;但是在开发微信小程序的过程中可能有的小伙伴发现transition这个属性它不好使&#xff08;下面说明&#xff09;所以我们这个时候会考虑去使用微信官方提供的wx.createAnim…