java - 圖片驗證碼實現原理
問題描述
**測試網站:http://con.monyun.cn:9960/acc...
在這個頁面中有一個驗證碼。這個驗證碼的url是
<img src='http://www.cgvv.com.cn/aut_checkCode.hts?=0.8963835985936632' class='icd'>
如何實現點擊驗證碼的時候更改顯示圖片??
說明:(1) 當你點擊驗證碼圖片的時候 ,img標簽的src屬性的 后面部分的數字會更改,一旦數字更改會就會引起瀏覽器訪問新的url獲取數據
(2)新的url中查詢字符串只有value沒有name,那么是不是說就服務器端就無法獲取到這個數字值?0.8963835985936632
服務器端有辦法獲取這個數字值嗎??
(3)假若 沒有辦法獲取到數字值。 服務器端處理請求,返回二進制圖像數據。這個時候會為圖片生成一個token嗎? 如果有生成那么如何傳遞給客戶端?
(4)用戶提交驗證碼。服務器端處理,那么如何驗證用戶提交的驗證碼是否正確?服務器端根據什么能夠從redis中獲取到正確的驗證碼?
各位說說給回復就頂!**
問題解答
回答1:謝邀, 一般來說, 驗證碼的工作步驟是這樣的:
實際上是服務器生成了一個4位字符串, 用這4位字符串生成圖片寫到response中, 返回給瀏覽器, 并把這個4位字符串存在了當前session中.
瀏覽器提交后, 用提交的字符串和session中的字符串進行對比, 完成驗證碼的校驗.
如果不用session比如可以設置到cookie中如下(key=test, value=test):
1.后面數字更改是避免瀏覽器緩存問題、2.不用使用任何參數,服務端會自動去按照時間銼什么的生成一個驗證碼(想看服務端是否能獲取)
3.驗證碼原理就是生成一串隨機數先存入session,最后生成images傳給客戶端給你識別,用戶提交驗證碼答案,服務端對你得答案和session當中的隨機數進行對比,一樣就說明驗證成功
4.如3
5.redis配合使用一般都會用到token或者session之內的,這樣可以標識這個驗證碼到底是哪一個用戶的,比如如下key
>keys *>uid_100_login_verify偽代碼
獲取驗證碼
User u=User();u.tmp_id=100;//唯一標識,傳給客戶端表單Random rand=new Random(種子);int v=rand.rand();//一般會生成其他得英文字母配合生成復雜的redisCli.add('uid_100_login_verify',random)//key,valueres.return(new Verify());
驗證
User u=User();u.tmp_id=$POST[’tmp_id’];//獲取客戶端string value=redisCli.get('uid_100_login_verify');//key return valueif($POST[’verify_code’]===value){ return '驗證成功';}回答3:
第一個:驗證碼的大致流程就是和你描述的一樣的。
第二個:生成驗證碼是不用往后臺傳值的,你給的例子,后面的那串數字的改變其實是為了實現重新請求 URL 而已,一般是圖片鏈接指向生成驗證碼的鏈接,點擊后使用 js 來給連接進行改變,就是后面加一串隨機數,這樣瀏覽器檢測到 src 后面的連接改變了(那串隨機字符串就是這個作用),然后就會重新請求后臺,獲取重新生成的驗證碼圖片。
第三個:后臺返回二進制圖片后,不需要生成 token ,但是需要把生成驗證碼的那串數字存到 session 里。要保存在服務器端,才安全,不需要返回到客戶端。
第四個:用戶輸入提交的驗證碼后,就把用戶提交的驗證碼數字,和服務端 session 里的數字進行對比。 如果一樣的話,就驗證通過。
至于最后把驗證碼放到redis里,你可以去搜索一下,如何把 session 存到 redis 里,相關的資料。
回答4:后臺代碼大體上是
public void genAuthImage(){
//生成token uuid //寫入cookieresponse.addCookie();--->實際上是設置set-cookie頭信息
//生成圖片使用response寫出end}前端:
前端:
chrome 檢查
控制臺
不確定的結論: response返回響應類型為image/jpg的時候 無法設置cookie。原因各位有看到的朋友可以解釋下嗎
相關文章:
1. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語法實現存在即更新應該使用哪個標簽?2. mysql - 數據庫建字段,默認值空和empty string有什么區別 1103. mysql - 這種分級一對多,且分級不平衡的模型該怎么設計表?4. Navicat for mysql 中以json格式儲存的數據存在大量反斜杠,如何去除?5. mac OSX10.12.4 (16E195)下Mysql 5.7.18找不到配置文件my.cnf6. java - 數據庫查詢多表7. 新人求教MySQL關于判斷后拼接條件進行查詢的sql語句8. mysql - 千萬數據 分頁,當偏移量 原來越大時,怎么優化速度9. MySQL FOREIGN KEY 約束報錯10. mysql - 數據庫表中,兩個表互為外鍵參考如何解決
