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

如何使用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 Rule All All博客上。

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

如何使用recaptcha

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

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

相关文章

micropython esp8266教程_(一)ESP8266/nodemcu如何使用MicroPython进行开发

简介 大家都知道ESP8266&#xff08;nodemcu&#xff09;可以使用arduino的语法&#xff08;C&#xff09;进行开发&#xff0c;也有些小伙伴可能也知道可以使用lua语言进行开发的。但是现在我们也可以使用python来开发esp8266&#xff08;nodemcu&#xff09;了。那么这篇教程…

PostGIS之路——几何对象编辑(二)

1、ST_Reverse返回几何对象顶点顺序相反的几何对象。geometry ST_Reverse(geometry g1);示例SQL&#xff1a;SELECT ST_AsText(the_geom) as line, ST_AsText(ST_Reverse(the_geom)) As reverselineFROM(SELECT ST_MakeLine(ST_MakePoint(1,2),ST_MakePoint(1,10)) As the_geom…

C++ cin.sync()和cin.ignore()

cin.sync()的功能是清空缓冲区&#xff0c;而cin.ignore()虽然也是删除缓冲区中数据的作用&#xff0c;但其对缓冲区中的删除数据控制的较精确。 有时候你只想取缓冲区的一部分&#xff0c;而舍弃另一部分&#xff0c;这是就可以使用cin.ignore()&#xff0c;其使用方法是&…

Spring Data对Cassandra 3的支持

名为Ingalls的新Spring Data发布火车的发布引起了我的关注&#xff0c;其中之一是Spring Data Cassandra最终支持Cassandra 3。 因此&#xff0c;我回顾了我的一个旧样本&#xff0c;并尝试了较新版本的Cassandra。 安装Cassandra 第一步是安装本地版本的Cassandra&#xff0c…

第12秒做视频封面:阿里云视频截帧功能

代码&#xff1a; <video src"http://ruilai-course.imreliable.net/fangcao_course/{{results.VideoName}}.mp4"poster"http://ruilai-course.imreliable.net/fangcao_course/{{results.VideoName}}.mp4?x-oss-processvideo/snapshot,t_12000,f_jpg,w_750,…

winform什么时候会调用closed事件_async/await 给程序带来了什么?

如果说async给ASP.NET带来的是处理能力的提高&#xff0c;那么在WinForm中给程序员带来的好处则是最大的。我们再也不用因为要实现异步写回调或者绑定事件了&#xff0c;省事了&#xff0c;可读性也提高了。不信你看下面我们将调用我们那个web service的代码在.NET4.5下实现一下…

Vtk出现Generic Warning时

Generic Warning: In D:\ProgramFiles\VTK\VTK-7.0.0\Rendering\Core\vtkPolyDataMapper.cxx, line 28 Error: no override found for ‘vtkPolyDataMapper’. Warning: In D:\ProgramFiles\VTK\VTK-7.0.0\Rendering\Core\vtkInteractorStyleSwitchBase.cxx, line 43 vtkInte…

Properties 持久的属性集

特点&#xff1a;1、Hashtable的子类&#xff0c;map集合中的方法都可以用。2、该集合没有泛型。键值都是字符串。3、它是一个可以持久化的属性集。键值可以存储到集合中&#xff0c;也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。 // 根据ke…

MySQL的简单使用

一&#xff0c;MySQL的使用 (1)启动MySQL服务&#xff08;DOS下输入&#xff09;net start mysql / 停止服务net stop mysql&#xff0c;其中mysql是你的数据库服务器的名字。 (2)登录MySQL:mysql -h localhost -u root -p回车后输入你的数据库登录密码。 出现如上图的信息说…

错误C4996:'std :: _Copy_impl'

编译示例程序时出现 错误C4996&#xff1a;std :: _Copy_impl&#xff1a;使用可能不安全的参数的函数调用(error C4996: std::_Copy_impl:Function call with parameters that may be unsafe) 在于处理器中添加 _SCL_SECURE_NO_WARNINGS

python编程口诀_科学网—Python编程技巧汇总 - 高关胤的博文

正在学习python编程&#xff0c;把一些小技巧记录下来备查 计算技巧 正常的条件语句如下if a>b:caelse:cb 可以写为以下简洁的语句a100b200ca if a>b else bprint(c) 作图 python中可以使用numpy的array来高效处理数组 下面主要列举matplotlib的基本使用方法&#xff0c;…

jsf标签p:ajax_JSF AJAX请求的会话超时处理

jsf标签<p:ajax>JSF AJAX请求的会话超时处理 当我们使用AJAX行为开发JSF应用程序时&#xff0c;在处理Ajax请求的超时情况时&#xff0c;我们可能会遇到问题。 例如&#xff0c;如果您使用的是基于J2EE Form的身份验证&#xff0c;则会话超时后应将正常请求重定向到登录页…

使用javamail发信过程中的一些问题及解决方法

今天在研究javamail发信的过程中&#xff0c;出现了一些小问题&#xff0c;现总结如下&#xff0c;以免后来者走些不必要的弯路&#xff0c;先把完整的能够正常运行的代码示例粘贴如下&#xff1a; 发邮件源代码&#xff1a; package com.hyq.test; import java.util.Propertie…

VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题

在用 VS2015 编译 Debug 版的 openCV 源码时&#xff0c;最后一步生成 INSTALL&#xff0c;碰到了下面问题&#xff1a;因为配置 Windows 版 caffe 的需要&#xff0c;我先安装了一个 Anaconda3&#xff08;3.6版本&#xff09;&#xff0c;caffe 最高支支持到 3.5 &#xff0c…

python做硬件自动化测试仪器_基于Python PyVisa和GPIB的硬件测试仪器控制方法

基于Python和GPIB的硬件测试仪器控制方法 背景 在物联网通信时代&#xff0c;嵌入式模块开发越发广泛&#xff0c;自动化测试成为大家老生常谈的话题。对于一些高精度仪器&#xff0c;我们知道它是用GPIB控制用来测试&#xff0c;也希望可以通过一个程序实现自动化控制&#xf…

外点惩处函数法·约束优化问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主同意不得转载&#xff0c;博客主页 http://blog.csdn.net/i_love_home https://blog.csdn.net/zstu_wangrui/article/details/36242529 外点惩处函数法约束优化问题 外点法惩处函数&#xff08;r添加&#xff0c;SU…

在单元测试和TDD中指定时间的重要性

最近&#xff0c;我一直在写与自动测试有关的更高级的概念&#xff08;主要与Spock有关&#xff09;。 但是&#xff0c;在进行测试培训时&#xff0c;我清楚地看到&#xff0c;通常对特定工具的知识并不是主要问题。 即使使用Spock&#xff0c;也可以编写肿且难以维护的测试&a…

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章&#xff0c;21篇文章的内容很多&#xff0c;个人认为&#xff0c;学习&#xff0c;内容越多、越杂的知识&#xff0c;越需要进行深刻的总结&#xff0c;这样才能记忆深刻&#xff0c;将知识变成自己的。这篇文章主要是对多线程的问题…

.pro.user文件

.pro.user 用于记录打开工程的路径&#xff0c;所用的编译器、构建的工具链、生成目录、打开工程的qt-creator的版本等。 当更换编译环境时&#xff0c;要将其删除。

python tkinter实例_python绘制一个图形示例源码(tkinter)

【实例简介】 【实例截图】【核心代码】 # -*- coding: utf-8 -*- #!/usr/bin/python import math from tkinter import * class PTS: def __init__(self): self.x 0 self.y 0 points [] def LineToDemo(): screenx 400 screeny 400 canvas Canvas(width screenx,height…