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