CAPTCHA是一種程序,可以生成人類可以通過的測試并對其進行評分,而計算機程序“ 不能 ”通過。 所采取的策略之一是向用戶顯示具有扭曲文本的圖像,并且用戶應在輸入區域中書寫文本。 如果顯示的文字與用戶輸入的文字相同,則我們可以“ 確保 ”有人在計算機上。
驗證碼示例:
驗證碼有幾種用于實際安全性的應用程序,例如:
- 在評論字段中防止垃圾郵件 。
- 防止大量用戶注冊 。
- 防止字典攻擊 。
- …
這些失真的文本的獲取方式如下:
- 數字化實體書籍/報紙。
- 頁面經過攝影掃描,然后使用“ 光學字符識別 ”(OCR)轉換為文本。
- OCR不是完美的,即不能由OCR正確地讀取被放置在圖像上并且用作CAPTCHA每個單詞。
- OCR無法正確讀取的單詞會與另一個已知答案的單詞一起提供給用戶。 然后要求讀取兩個單詞,如果用戶解決了答案已知的單詞,則系統認為他們的答案對于新單詞是正確的。 然后,系統將新圖像提供給其他許多人,以便更有把握地確定原始答案是否正確。
現在您知道了驗證碼的工作原理,問題是,如果您想在網站上使用驗證碼 ,則應該實施上述過程,這當然并不容易,而且繁瑣的工作需要數字化處理。 因此,有些“驗證碼提供商 ”已經為我們完成了這項工作。 這些提供商之一是reCaptcha http://www.google.com/recaptcha 。 reCaptcha是一項免費的驗證碼服務,可向我們提供這些驗證 碼 ,可在我們的網站中使用。 作為開發人員,我們只需要在客戶端嵌入一段代碼以顯示驗證碼圖像和文本區域,在服務器端嵌入一段代碼即可調用用于解析輸入數據的函數。 reCaptcha提供了用于處理許多編程語言(如Java , PHP , Perl …)的插件。
這篇文章將指導您如何在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);}
結果變量是傳遞給類型BindingResult的submitForm的屬性。 當然,應使用<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