在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.pswp.cn/news/370392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370392.shtml
英文地址,請注明出處:http://en.pswp.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…