javascript
在Spring MVC Web应用程序中使用reCaptcha
CAPTCHA是一種程序,可以生成人類(lèi)可以通過(guò)的測(cè)試并對(duì)其進(jìn)行評(píng)分,而計(jì)算機(jī)程序“ 不能 ”通過(guò)。 所采取的策略之一是向用戶顯示具有扭曲文本的圖像,并且用戶應(yīng)在輸入?yún)^(qū)域中書(shū)寫(xiě)文本。 如果顯示的文字與用戶輸入的文字相同,則我們可以“ 確保 ”有人在計(jì)算機(jī)上。
驗(yàn)證碼示例:
驗(yàn)證碼有幾種用于實(shí)際安全性的應(yīng)用程序,例如:
- 在評(píng)論字段中防止垃圾郵件 。
- 防止大量用戶注冊(cè) 。
- 防止字典攻擊 。
- …
這些失真的文本的獲取方式如下:
現(xiàn)在您知道了驗(yàn)證碼的工作原理,問(wèn)題是,如果您想在網(wǎng)站上使用驗(yàn)證碼 ,則應(yīng)該實(shí)施上述過(guò)程,這當(dāng)然并不容易,而且繁瑣的工作需要數(shù)字化處理。 因此,有些“驗(yàn)證碼提供商 ”已經(jīng)為我們完成了這項(xiàng)工作。 這些提供商之一是reCaptcha http://www.google.com/recaptcha 。 reCaptcha是一項(xiàng)免費(fèi)的驗(yàn)證碼服務(wù),可向我們提供這些驗(yàn)證 碼 ,可在我們的網(wǎng)站中使用。 作為開(kāi)發(fā)人員,我們只需要在客戶端嵌入一段代碼以顯示驗(yàn)證碼圖像和文本區(qū)域,在服務(wù)器端嵌入一段代碼即可調(diào)用用于解析輸入數(shù)據(jù)的函數(shù)。 reCaptcha提供了用于處理許多編程語(yǔ)言(如Java , PHP , Perl …)的插件。
這篇文章將指導(dǎo)您如何在Spring MVC Web應(yīng)用程序中使用reCaptcha 。 該應(yīng)用程序包含用于注冊(cè)新用戶的表格。 此表單包含一個(gè)驗(yàn)證碼,用于避免機(jī)器人啟動(dòng)大規(guī)模注冊(cè)攻擊。
第一步是打開(kāi)一個(gè)帳戶來(lái)reCaptcha網(wǎng)站(您可以使用您的Google帳戶或創(chuàng)建一個(gè)新帳戶)。
輸入后,轉(zhuǎn)到我的帳戶 - 添加新站點(diǎn) 。
然后在域框中,您應(yīng)該編寫(xiě)將包含驗(yàn)證碼驗(yàn)證的域。 在此示例中,我輸入了localhost并選中了在所有域上啟用此鍵(全局鍵) 。 當(dāng)然,這里提供的信息是用于測(cè)試海豚的,并且在生產(chǎn)環(huán)境中應(yīng)該有所不同。 注冊(cè)網(wǎng)站后,將提供兩個(gè)密鑰,即私鑰 (XXXX)和公鑰 (YYYY)。
在編碼之前,讓我展示一下reCAPTCHA挑戰(zhàn)的基本生命周期。 該圖來(lái)自reCaptcha網(wǎng)站:
第二步是創(chuàng)建一個(gè)Spring MVC應(yīng)用程序,這里沒(méi)有什么秘密,我將只解釋reCaptcha集成中隱含的部分 。 除了SpringMVC依賴性之外,還應(yīng)該添加recaptcha4j API :
<dependency><groupId>net.tanesha.recaptcha4j<groupId><artifactId>recaptcha4j<artifactId><version>0.0.7<version><dependency>recaptcha4j.jar是一個(gè)API ,它提供了一種在基于Java的網(wǎng)站上放置驗(yàn)證碼的簡(jiǎn)單方法。 該庫(kù)包裝了reCAPTCHA API 。
將reCaptcha集成到表單中,需要進(jìn)行兩項(xiàng)修改:
- 一個(gè)在客戶端,用于連接到reCaptcha服務(wù)器并獲得挑戰(zhàn) 。
- 服務(wù)器端的第二個(gè)服務(wù)器,用于連接到reCaptcha服務(wù)器以發(fā)送用戶的答案,并返回響應(yīng)。
客戶端:
對(duì)于客戶端側(cè)的TAGFILE已創(chuàng)建封裝的Recaptcha API的所有邏輯在一個(gè)單一的點(diǎn),所以可以在所有JSP形式進(jìn)行再利用。
<%@ 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類(lèi)需要在第一步中由reCaptcha提供的私鑰 (XXXX)和公鑰 (YYYY)。 方法createRecaptchaHtml (…)創(chuàng)建了一段html代碼來(lái)顯示挑戰(zhàn)。 實(shí)際上,它會(huì)生成如下內(nèi)容:
最后是帶有表單和驗(yàn)證碼信息的JSP頁(yè)面:
<%@ 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 標(biāo)簽庫(kù)生成的,但也我們使用創(chuàng)建TAGFILE(<標(biāo)簽:驗(yàn)證碼>)用于嵌入驗(yàn)證碼成形式。
服務(wù)器端:
服務(wù)器端甚至比客戶端更簡(jiǎn)單。 當(dāng)使用createRecaptchaHtml創(chuàng)建驗(yàn)證碼時(shí),將創(chuàng)建兩個(gè)表單元素字段, recaptcha_challenge_field包含有關(guān)向用戶顯示的質(zhì)詢的信息,而recaptcha_response_field包含用戶對(duì)質(zhì)詢的答案。
除了這兩個(gè)參數(shù)之外, recaptcha4j還需要遠(yuǎn)程地址。 ServletRequest接口對(duì)此海豚有一個(gè)方法( 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對(duì)象是使用Spring注入的。 請(qǐng)務(wù)必注意, UserInfo (用戶以表單形式輸入的數(shù)據(jù))不包含有關(guān)驗(yàn)證碼的任何信息,它僅包含“業(yè)務(wù)”數(shù)據(jù)。 使用@ RequestParam,reCaptcha信息由Spring檢索,可以直接用于reCaptcha對(duì)象。
另一個(gè)重要的部分是isValid()方法。 此方法僅檢查reCaptcha站點(diǎn)的響應(yīng)是否表明用戶已通過(guò)挑戰(zhàn)。 因此,根據(jù)結(jié)果,您應(yīng)該采取行動(dòng),如果未通過(guò)挑戰(zhàn),請(qǐng)返回上一頁(yè)。
<bean id='recaptcha' class='net.tanesha.recaptcha.ReCaptchaImpl'><property name='privateKey' value='XXXX'><property><bean>該bean定義僅用于使用您的私鑰實(shí)例化reCaptcha類(lèi)。 使用@Autowire將 bean注入controller中 。
第三步:
最后一步是觀看創(chuàng)建的表單顯示驗(yàn)證碼圖像,控制器根據(jù)您在驗(yàn)證碼文本區(qū)域中輸入的內(nèi)容將您重定向到頁(yè)面。
額外步驟:
現(xiàn)在,您已經(jīng)有了關(guān)于如何使用reCaptcha的基本概念,下一步(超出本文的討論范圍)不是再次顯示表單而沒(méi)有任何錯(cuò)誤消息,您可以在Controller中使用BindingResult來(lái)向用戶通知錯(cuò)誤消息:
if (!reCaptchaResponse.isValid()) {FieldError fieldError = new FieldError('userInfo','captcha','Please try again.');result.addError(fieldError);}結(jié)果變量是傳遞給類(lèi)型BindingResult的submitForm的屬性。 當(dāng)然,應(yīng)使用<form:errors path ='captcha'/>更改JSP以顯示錯(cuò)誤消息。
另一個(gè)改進(jìn)是創(chuàng)建與驗(yàn)證碼驗(yàn)證形成的HandlerInterceptor。 例如, ReCaptchaHandlerInterceptorAdapter將包含reCaptcha管理。 如果驗(yàn)證碼質(zhì)詢由用戶正確解決(允許定義的控制器執(zhí)行其工作),則preHandle方法將返回true,否則將返回false并重定向到錯(cuò)誤頁(yè)面。
<mvc:interceptors><mvc:interceptor><mapping path='*.form'><bean class='org.springsource.mvc.ReCaptchaHandlerInterceptorAdapter' ><mvc:interceptor><mvc:interceptors>使用先前的處理程序配置,所有表格都將具有驗(yàn)證碼驗(yàn)證功能。
希望這篇文章對(duì)您有所幫助,現(xiàn)在您可以開(kāi)始保護(hù)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
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的在Spring MVC Web应用程序中使用reCaptcha的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 出国人员备案表(出国人员备案)
- 下一篇: Spring MVC表单验证(带批注)