recaptcha_与reCAPTCHA的Spring集成

recaptcha

有时我们只需要CAPTCHA ,这是一个可悲的事实。 今天,我们将学习如何与reCAPTCHA集成。 因为主题本身并不是特别有趣和高级,所以我们将通过使用Spring Integration处理低级细节来过度设计(?)。 Google决定使用reCAPTCHA的决定取决于两个因素:(1)这是一种适度良好的CAPTCHA实施,内置了对视力障碍者的内置支持的体面图像;(2)将CAPTCHA外包可使我们在服务器端保持无状态。 更不用说我们在图书数字化方面有所帮助。
第二个原因实际上很重要。 通常,您必须在服务器端生成CAPTCHA,并将预期结果存储在例如用户会话中。 当响应返回时,您比较预期的并输入了CAPTCHA解决方案。 有时我们不想在服务器端存储任何状态,更不用说实现验证码并不是特别有意义的任务。 因此,拥有现成的,可以接受的东西真是太好了。
完整的源代码一如既往地可用,我们从一个没有任何验证码的简单Spring MVC Web应用程序开始。 reCAPTCHA是免费的,但需要注册,因此第一步是在我们的示例项目中使用并生成您的公钥/私钥和填写的app.properties配置文件。
要在表单上显示reCAPTCHA并将其包括在表单中,只需添加JavaScript库:
<div id="recaptcha"> </div>
...
<script src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
并将reCAPTCHA小部件放置在您喜欢的任何位置:
Recaptcha.create("${recaptcha_public_key}","recaptcha",{theme: "white",lang : 'en'}
);
官方文档非常简洁和描述性强,因此我不会深入探讨这一细节。 当您在<form/>包含此小部件时,当用户提交时,您将收到两个额外的字段: recaptcha_response_fieldrecaptcha_challenge_field 。 第一个是用户键入的实际文本,第二个是每个请求生成的隐藏令牌。 reCAPTCHA服务器可能会将它用作会话密钥,但是我们不在乎,我们要做的就是将此字段进一步传递给reCAPTCHA服务器 。 我将使用HttpClient 4对外部服务器执行HTTP请求,并在Scala中执行一些巧妙的模式匹配来解析响应:
trait ReCaptchaVerifier {def validate(reCaptchaRequest: ReCaptchaSecured): Boolean}@Service
class HttpClientReCaptchaVerifier @Autowired()(httpClient: HttpClient,servletRequest: HttpServletRequest,@Value("${recaptcha_url}") recaptchaUrl: String,@Value("${recaptcha_private_key}") recaptchaPrivateKey: String) extends ReCaptchaVerifier {def validate(reCaptchaRequest: ReCaptchaSecured): Boolean = {val post = new HttpPost(recaptchaUrl)post.setEntity(new UrlEncodedFormEntity(List(new BasicNameValuePair("privatekey", recaptchaPrivateKey),new BasicNameValuePair("remoteip", servletRequest.getRemoteAddr),new BasicNameValuePair("challenge", reCaptchaRequest.recaptchaChallenge),new BasicNameValuePair("response", reCaptchaRequest.recaptchaResponse))))val response = httpClient.execute(post)isReCaptchaSuccess(response.getEntity.getContent)}private def isReCaptchaSuccess(response: InputStream) = {val responseLines = Option(response) map {Source.fromInputStream(_).getLines().toList} getOrElse NilresponseLines match {case "true" :: _ => truecase "false" :: "incorrect-captcha-sol" :: _=> falsecase "false" :: msg :: _ => throw new ReCaptchaException(msg)case resp => throw new ReCaptchaException("Unrecognized response: " + resp.toList)}}}class ReCaptchaException(msg: String) extends RuntimeException(msg)
唯一缺少的部分是ReCaptchaSecured特性,它封装了前面提到的两个reCAPTCHA字段。 为了使用reCAPTCHA保护任何Web表单,我只是在扩展此模型:
trait ReCaptchaSecured {@BeanProperty var recaptchaChallenge = ""@BeanProperty var recaptchaResponse = ""
}class NewComment extends ReCaptchaSecured {@BeanProperty var name = ""@BeanProperty var contents = ""
}
整个CommentsController.scala并不相关。 但是结果是!
这样就可以了,但是显然并不是很壮观。 对于使用Spring Integration替换低级HttpClient调用,您说什么? ReCaptchaVerifier接口(特征)保持不变,因此不必更改客户端代码。 但是我们将HttpClientReCaptchaVerifier重构为两个单独的,较小的,相对高级的抽象类:
@Service
class ReCaptchaFormToHttpRequest @Autowired() (servletRequest: HttpServletRequest, @Value("${recaptcha_private_key}") recaptchaPrivateKey: String) {def transform(form: ReCaptchaSecured) = Map("privatekey" -> recaptchaPrivateKey,"remoteip" -> servletRequest.getRemoteAddr,"challenge" -> form.recaptchaChallenge,"response" -> form.recaptchaResponse).asJava}@Service
class ReCaptchaServerResponseToResult {def transform(response: String) = {val responseLines = response.split('\n').toListresponseLines match {case "true" :: _ => truecase "false" :: "incorrect-captcha-sol" :: _=> falsecase "false" :: msg :: _ => throw new ReCaptchaException(msg)case resp => throw new ReCaptchaException("Unrecognized response: " + resp.toList)}}}
请注意,我们不再需要实现ReCaptchaVerifier ,Spring Integration将为我们做到这一点。 我们只需要告诉我们框架应该如何使用上面提取的构建块。 我想我还没有描述Spring Integration是什么以及它是如何工作的。 简而言之,它是企业集成模式的非常纯净的实现(有些人可能将其称为ESB)。 消息流是使用XML描述的,可以嵌入到标准Spring XML配置中:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/integration"xmlns:http="http://www.springframework.org/schema/integration/http"xsi:schemaLocation="http://www.springframework.org/schema/integrationhttp://www.springframework.org/schema/integration/spring-integration.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/integration/httphttp://www.springframework.org/schema/integration/http/spring-integration-http.xsd"><!-- configuration here -->    </beans:beans>
在我们的案例中,我们将描述从HttpClientReCaptchaVerifier Java接口/ Scala特征到reCAPTCHA服务器再返回的消息流。 在必须将ReCaptchaSecured对象转换为HTTP请求并将HTTP响应转换为有意义的结果的方式上,该方法从接口透明返回。
<gateway id="ReCaptchaVerifier" service-interface="com.blogspot.nurkiewicz.recaptcha.ReCaptchaVerifier" default-request-channel="reCaptchaSecuredForm"/><channel id="reCaptchaSecuredForm" datatype="com.blogspot.nurkiewicz.web.ReCaptchaSecured"/><transformer input-channel="reCaptchaSecuredForm" output-channel="reCaptchaGoogleServerRequest" ref="reCaptchaFormToHttpRequest"/><channel id="reCaptchaGoogleServerRequest" datatype="java.util.Map"/><http:outbound-gatewayrequest-channel="reCaptchaGoogleServerRequest"reply-channel="reCaptchaGoogleServerResponse"url="${recaptcha_url}"http-method="POST"extract-request-payload="true"expected-response-type="java.lang.String"/><channel id="reCaptchaGoogleServerResponse" datatype="java.lang.String"/><transformer input-channel="reCaptchaGoogleServerResponse" ref="reCaptchaServerResponseToResult"/>
尽管有大量的XML,但是整个消息流还是非常简单的。 首先我们定义网关 ,它是Java接口和Spring Integration消息流之间的桥梁。 ReCaptchaVerifier.validate()的参数稍后变成一条消息 ,该消息发送到reCaptchaSecuredForm channel 。 ReCaptchaSecured对象从该通道传递到ReCaptchaFormToHttpRequest 转换器 。 转换器的目的是从ReCaptchaSecured对象到Java映射进行两次转换,以表示一组键值对。 稍后,此映射(通过reCaptchaGoogleServerRequest通道)传递到http:outbound-gateway 。 该组件的职责是将先前创建的地图转换为HTTP请求并将其发送到指定的地址。
当响应返回时,它被发送到reCaptchaGoogleServerResponse通道。 ReCaptchaServerResponseToResult转换器将采取行动,将HTTP响应转换为业务结果(布尔值)。 最终,转换器结果被路由回网关。 默认情况下,所有操作都是同步发生的,因此我们仍然可以使用简单的Java接口进行reCAPTCHA验证。
信不信由你,这一切正常。 我们不再使用HttpClient (猜测一切都比HttpClient 4 API更好……),而不是一个“巨大”的类,我们有一组较小的,集中的,易于测试的类。 该框架处理接线和底层细节。 精彩?
建筑师的梦想还是开发商的噩梦?
让我通过引用以上介绍的结论来总结我们的工作:在架构收益与开发有效性之间取得平衡 。 Spring Integration能够从各种异构源(如JMS,关系数据库甚至FTP)接收数据,以多种方式聚合,拆分,解析和过滤消息,最后使用最奇特的协议将其进一步发送。 手工编写所有代码是一项非常繁琐且容易出错的任务。 另一方面,有时我们只是不需要所有的幻想,而弄脏我们的手(例如,通过执行手动HTTP请求并解析响应)则更加简单易懂。 在盲目地将整个体系结构基于非常高级的抽象或基于手工编码的低级过程之前,请考虑一下后果和平衡。 没有解决方案可以解决所有问题。 您发现哪个版本的reCAPTCHA集成更好​​?
参考: 使用以下方法与reCAPTCHA集成 : Java和社区博客中我们JCG合作伙伴 Tomasz Nurkiewicz的Spring Integration 。

翻译自: https://www.javacodegeeks.com/2012/05/spring-integration-with-recaptcha.html

recaptcha

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

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

相关文章

honeywell新风系统控制面板说明_如何选择新风系统中的新风设备万家舒适家

喜欢点击蓝字关注我们吧我们常说“看人不光要看外表&#xff0c;更要看内在”&#xff0c;这个说法对新风机同样适用。新风机的内部件主要分为&#xff1a;动力模块、电控模块、净化模块、热交换模块这四个部分。首先、动力模块&#xff0c;就是风机。从我们消费者角度来看&…

第八周学习进度条

转载于:https://www.cnblogs.com/baiyue/p/7110849.html

设计模式的Java 8 Lambda表达式–策略设计模式

策略模式定义封装在通常称为Context的驱动程序类中的一系列算法&#xff0c;并使这些算法可互换。 它使算法易于互换&#xff0c;并提供了在特定时间选择适当算法的机制。 算法&#xff08;策略&#xff09;在运行时由客户端或上下文选择。 在与客户端交互期间&#xff0c;Con…

sata修改为ahci后系统无法启动_固态重装系统

固态硬盘凭借其高速的读写速度&#xff0c;已经成为现如今很多用户电脑的标配。对于刚刚为电脑换上固态硬盘的用户来说&#xff0c;固态硬盘里并没有装有系统&#xff0c;因此首要任务就是进行重装系统win10。那么&#xff0c;固态硬盘如何装系统呢?为固态硬盘重装系统&#x…

10年老电脑如何提速_中国电信宣布将对宽带免费提速,最高500Mbps

电信宽带用户们有福了&#xff01;中国电信宣布&#xff0c;自11月9日到12月31日&#xff0c;启动“智慧生活好物节&#xff0c;宽带免费加速度”活动&#xff0c;对接入速率200Mbps以下的电信光纤宽带家庭用户&#xff0c;免费在线提速到200Mbps。接入速率大于等于200Mbps但小…

gromacs 安装_带你入门带你飞 gromacs材料计算模拟系列

为了帮助大家了解掌握gromacs材料计算模拟计算&#xff0c;材料人于9月28日举办该主题研讨会。视频回看已经上线。培训内容1 GROMACS入门操作基础1.1掌握GROMACS所用的Linux命令1.2 GROMACS的linux版编译安装1.3 GROMACS各种输入输出文件讲解1.4 GROMACS力场讲解2 GROMACS建模2…

计算机c盘能分区吗,电脑C盘怎么分区

电脑C盘怎么分区C盘是指电脑硬盘主分区之一&#xff0c;一般用于储存或安装系统使用。针对安装在本地硬盘的单操作系统来说&#xff0c;是默认的本地系统启动硬盘。下面是jy135小编收集整理的电脑C盘怎么分区&#xff0c;欢迎阅读。以Windows 7为例&#xff0c;鼠标右键选择计算…

PCB-电解电容的封装

点击到完成即可 转载于:https://www.cnblogs.com/liangjinjie/p/6719605.html

java虚拟机_Oracle独家:Java虚拟机学习指南

大家好&#xff0c;我是极客时间《深入拆解 Java 虚拟机》作者、Oracle Labs 高级研究员郑雨迪。有幸借这个专题的机会&#xff0c;能和大家分享为何 Java 工程师要学 Java 虚拟机&#xff1f;如何掌握 Java 虚拟机&#xff1f;工欲善其事&#xff0c;必先利其器“为什么学 Jav…

windows聚焦壁纸不更新_壁纸推荐说 | 爱上你的壁纸,每天更新的免费壁纸软件dynamic theme...

搜罗东西 好物尝鲜图&#xff5c;源网络文&#xff5c;百里丶“ 看官们好&#xff01;这里是每期都在的百里&#xff0c;每期的好物推荐缘由都会出现在这里。喜欢的小伙伴可以点个关注呦!看过前文的小伙伴都知道百里是一个爱好尝鲜的&#xff0c;那对于自己每天一定会接触到的…

jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友搏斗字节码

欢迎来到jOOQ Tuesdays系列。 在本系列中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及其他各种相关主题的人员。 我们很高兴在第七版中与Rafae…

软件工程个人作业03—找水王

实验要求&#xff1a; 结对开发伙伴&#xff1a; 姓名&#xff1a;陶雨洁 博客地址链接&#xff1a;http://www.cnblogs.com/Amyheartxy/p/6736268.html 一、设计思想 其实在课堂上&#xff0c;老师已经点出了一点思路&#xff0c;已经很接近于答案&#xff0c;具体思路如下&am…

wps分享为什么要登入_【知识分享】柴油为什么要加氢处理?

柴油是石油经过常压分馏后得到的产物。如果直接由石油炼制得到&#xff0c;柴油中的硫、氮、氧含量较高&#xff0c;烯烃的含量也比较高。产品中烯烃的含量高则容易出现变色现象&#xff0c;而且还会影响机动车的使用寿命&#xff0c;对大气污染程度也相对大些。为了克服上面这…

mybatisplus 结果_SpringBoot + MyBatisPlus 快速入门

Hello,大家好&#xff01;前面与大家分享了一次如何搭建Java项目脚手架&#xff0c;并且送给大家一个基础项目模板。那今天与大家分享如何使用这个基础项目&#xff0c;也就是快速上手 SpringBoots ➕ MyBatisPlus。 项目 / 目录结构 天津商业大学学院信息 这是一张天津商业大学…

w7鼠标计算机无法识别,win7电脑遇见usb鼠标无法标识的详细处理步骤

部分win7电脑用户遇见usb鼠标无法标识的情况&#xff0c;要怎么处理呢?下面教程就为你们带来了win7电脑遇见usb鼠标无法标识的详细处理步骤。1、首先&#xff0c;如果你的鼠标出现没有反应的情况&#xff0c;你就把鼠标拔下来&#xff0c;然后插到电脑的另一个USB插口上面&…

小米air2se耳机只有一边有声音怎么办_别光盯着AirPods,这些无线蓝牙耳机,其实也很好用...

几年前TWS耳机市场还是AirPods的天下&#xff0c;但如今TWS已经不再是苹果专属&#xff0c;很多手机厂商也入局TWS耳机行列里来&#xff0c;推出了很多高性价比的TWS耳机&#xff0c;今天小编就给大家推荐4款TWS耳机&#xff0c;当然如果有更好的推荐也欢迎大家补充。1、小米 A…

webpack打包生成的map文件_一站式搞明白webpack中的代码分割

上次分析到通过devtool的配置项来设置source map&#xff0c;在线上环境可以通过设置成cheap-module-source-map来生成单独的map文件&#xff0c;但是map文件在线上环境会不会每次都加载呢&#xff1f;如果加载的话&#xff0c;会不会造成带宽和请求的浪费呢&#xff1f;笔者也…

计算机PMA,PMA通信协议分析及仿真工具

PMA通信协议分析及仿真软件是专为计算机通信开发人员打造的一款模拟分析工具&#xff0c;现在不少设备在进行开发的时候都需要对通信协议进行分析了&#xff0c;使用这款工具可以有效地对设备进行模拟、查看通信状况以及进行模拟仿真处理等操作&#xff0c;软件提供了多种运行模…

红帽JBoss企业应用平台7.0 ALPHA发布了!

红帽JBoss企业应用程序平台7&#xff08;JBoss EAP 7&#xff09;是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集&#xff0c;消息传递&#xff0c;分布式缓存和其他技术集成在一起。 现在可以下载最新…

chrome只能装在c盘吗_电脑硬盘使用与文件整理入门——逃离C盘?

在Windows 10伴随着SSD固态硬盘大范围铺开的背景下&#xff0c;曾经广泛传播的硬盘使用模式&#xff08;C盘装系统&#xff0c;D盘装软件&#xff0c;E、F盘放各种文件&#xff09;是否还有实践意义&#xff1f;我们该基于什么样的理念来养成一些良好习惯&#xff0c;从而安全又…