小小驗(yàn)證碼,作用可真不小!
我們在開發(fā)用戶登錄功能的時(shí)候,總是會被要求加一個(gè)驗(yàn)證碼的功能!那么,為什么要加這個(gè)驗(yàn)證碼?驗(yàn)證碼有什么作用?常見的驗(yàn)證碼有哪些?
驗(yàn)證碼就是為了增強(qiáng)網(wǎng)站的安全性,防止機(jī)器暴力破解。驗(yàn)證碼一般都會設(shè)置為歪歪扭扭的圖片,這樣做的目的也是為了增加機(jī)器識別的難度。
機(jī)器一般會通過枚舉法進(jìn)行匹配驗(yàn)證碼,枚舉法是利用計(jì)算機(jī)運(yùn)算速度快、精確度高的特點(diǎn),對要解決問題的所有可能情況,一個(gè)不漏地進(jìn)行檢驗(yàn),從中找出符合要求的答案,因此枚舉法是通過犧牲時(shí)間來換取答案的全面性。
為了防止機(jī)器暴力破解,驗(yàn)證碼一般會有一個(gè)過期時(shí)間,并且每個(gè)驗(yàn)證碼只能被使用一次。
設(shè)置驗(yàn)證碼有效時(shí)長:
- redisService.setCacheObject(verifyKey, verifyCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
每次使用驗(yàn)證碼后刪除redis:
- private void checkCode(String code, String uuid) throws ValidateCodeException {
- if (StringUtils.isEmpty(code)) {
- throw new ValidateCodeException("圖片驗(yàn)證碼不能為空");
- }
- if (StringUtils.isEmpty(uuid)) {
- throw new ValidateCodeException("圖片驗(yàn)證碼已失效");
- }
- String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
- String captcha = redisService.getCacheObject(verifyKey);
- redisService.deleteObject(verifyKey);
- }
IE瀏覽器下使用GET發(fā)送請求時(shí),如果兩次請求的地址和參數(shù)相同,在不刷新頁面的情況下,瀏覽器會緩存第一次請求的內(nèi)容,服務(wù)端更新后瀏覽器仍然顯示第一次的內(nèi)容。這也就是為什么我們總會看到驗(yàn)證碼請求地址上會增加一個(gè)隨機(jī)數(shù)的原因。
- https://ip:port?getCode?random = new Date().getTime();
常見的驗(yàn)證碼:
- 四位數(shù)字,隨機(jī)的數(shù)字字符串,最原始的驗(yàn)證碼,驗(yàn)證作用幾乎為零。
- 隨機(jī)數(shù)字+字母及干擾像素的圖片。
- 滑動(dòng)拼圖(這種方式完全是由前端完成的)。
本文轉(zhuǎn)載自微信公眾號「Java旅途」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java旅途公眾號。























