亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

H5學習之路-圖片驗證碼的實現

2024-04-27 15:12:48
字體:
來源:轉載
供稿:網友

驗證碼想必大家都經常遇到,今天就給大家介紹一個比較簡單的圖片驗證碼的實現。 要實現驗證碼主要分生成和驗證兩步。首先生成,就是指某個用戶看到驗證碼后臺立馬生成的,然后把這個生成圖片的字符串保存放在session或者內存中;要驗證用戶輸入的字符串與生成的驗證碼是否一致,就是取出這個session中保存的字符串與用戶輸入的驗證碼進行比對即可。

一、html代碼

筆者寫了一個很簡單的html界面,來簡單模擬下過程,代碼如下:

<!DOCTYPE html><html><head> <title>圖片驗證碼</title> <meta charset="utf-8"/></head><body><input type="number" class="ui input row-1" placeholder="請輸入驗證碼" id="yzm"><a href="javascrJavascript"></script><script src="../../scripts/captcha/imageCode.js" type="text/javascript"></script></body></html>

頁面展示如下: 這里寫圖片描述

二、js代碼

交互邏輯代碼如下,比較簡單,所以也用不著做啥介紹:

/** * 圖片驗證碼 */var mobileKey = '';$(function() { console.log('圖片驗證碼。。。'); getTicketImg(); //點擊驗證碼圖片 $('#randomImg').click(function() { getTicketImg(); }); //提交 $('#save_btn').click(function() { //獲取輸入框的驗證碼 var code = $('#yzm').val(); console.log('code:' + code + ', mobileKey:' + mobileKey); var param = { code: code, mobileKey: mobileKey }; $.post('/sys/captcha/validateImageCode.do', param, function(data) { console.log('data:', data); getTicketImg(); }); });});/** * 獲取圖片驗證碼 */function getTicketImg() { var ticket_key = Math.floor(Math.random() * 1000000); mobileKey = ticket_key; $("#yzm").val(""); var randomImg = "/sys/captcha/generateImageCode.do?mobileKey=" + ticket_key; $("#randomImg").attr("src", randomImg);}

三、后臺驗證碼圖片生成以及驗證

驗證碼圖片生成的代碼還是挺多的,這里使用的是patchca這個插件,版本是0.5.0的,大家可以在網上去下載,上傳到自己私服的第三方庫。 代碼如下:

/** * PRoject Name:qyk_testSpringMVC * File Name:CaptchaController.java * Package Name:com.qiyongkang.sys.controller * Date:2017年2月7日上午9:49:30 * Copyright (c) 2017, Thinkive(http://www.thinkive.com/) All Rights Reserved. **/package com.qiyongkang.sys.controller;import java.awt.Color;import java.io.IOException;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import java.util.Random;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.patchca.color.ColorFactory;import org.patchca.filter.predefined.CurvesRippleFilterFactory;import org.patchca.filter.predefined.DiffuseRippleFilterFactory;import org.patchca.filter.predefined.DoubleRippleFilterFactory;import org.patchca.filter.predefined.MarbleRippleFilterFactory;import org.patchca.filter.predefined.WobbleRippleFilterFactory;import org.patchca.service.ConfigurableCaptchaService;import org.patchca.utils.encoder.EncoderHelper;import org.patchca.Word.RandomWordFactory;import org.springframework.stereotype.Controller;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.qiyongkang.sys.Constants;import com.qiyongkang.sys.dto.ExtJsObject;/** * ClassName:CaptchaController <br/> * Function: 驗證碼. <br/> * Date: 2017年2月7日 上午9:49:30 <br/> * * @author qiyongkang * @version * @since JDK 1.6 * @see */@Controller@RequestMappingpublic class CaptchaController { /** * 日志類 */ private static Logger logger = LogManager.getLogger(CaptchaController.class); private static ConfigurableCaptchaService cs = new ConfigurableCaptchaService(); private static int MAX_LENGTH = 4; private static int MIN_LENGTH = 4; private static Random random = new Random(); private static Map<String, String> vcodeMap = new HashMap<String, String>(); public static void saveVcode(String key, String vcode) { vcodeMap.put(key, vcode); } public static String getVcode(String key) { return vcodeMap.get(key); } public static void removeVcode(String key) { vcodeMap.remove(key); } public static void emptyAllVcode() { vcodeMap.clear(); } static { cs.setColorFactory(new ColorFactory() // 隨機生成顏色 { public Color getColor(int x) { int[] c = new int[3]; int i = random.nextInt(c.length); for (int fi = 0; fi < c.length; fi++) { if (fi == i) { c[fi] = random.nextInt(71); } else { c[fi] = random.nextInt(256); } } return new Color(c[0], c[1], c[2]); } }); RandomWordFactory wf = new RandomWordFactory(); wf.setCharacters("123456789");// 設置驗證碼的內容 wf.setMaxLength(MAX_LENGTH); wf.setMinLength(MIN_LENGTH); cs.setWordFactory(wf); } /** * * generateImageCode: 生成圖片驗證碼. <br/> * * @author qiyongkang * @param request * @param response * @since JDK 1.6 */ @RequestMapping public void generateImageCode(HttpServletRequest request, HttpServletResponse response) { switch (random.nextInt(5)) {// 隨機生成不同形式驗證碼 case 0: cs.setFilterFactory(new CurvesRippleFilterFactory(cs.getColorFactory()));// 取現波紋 break; case 1: cs.setFilterFactory(new MarbleRippleFilterFactory());// 大理石波紋 break; case 2: cs.setFilterFactory(new DoubleRippleFilterFactory());// 雙波紋 break; case 3: cs.setFilterFactory(new WobbleRippleFilterFactory());// 擺波紋 break; case 4: cs.setFilterFactory(new DiffuseRippleFilterFactory());// 雙波紋 break; } setResponseHeader(response); // 設置響應頭 HttpSession session = request.getSession(true); OutputStream os = null; String codeStr = ""; try { os = response.getOutputStream(); codeStr = EncoderHelper.getChallangeAndWriteImage(cs, "png", os); } catch (IOException e) { logger.error("生成驗證碼圖片異常", e); } finally { if (os != null) { try { os.flush(); os.close(); } catch (IOException e) { logger.error("關閉流異常", e); } } } logger.info("當前的SessionID=" + session.getId() + ", 驗證碼:" + codeStr); String key = request.getParameter("mobileKey"); if (key == null) { key = ""; } //保存到map中 saveVcode(key, codeStr); //放在session中 session.setAttribute(Constants.TICKET + key, codeStr); } /** * * validateImageCode: 校驗圖片驗證碼. <br/> * * @author qiyongkang * @since JDK 1.6 */ @RequestMapping @ResponseBody public ExtJsObject validateImageCode(HttpServletRequest request) { ExtJsObject extJsObject = new ExtJsObject(); //code String code = request.getParameter("code"); //mobileKey String mobileKey = request.getParameter("mobileKey"); if (StringUtils.isEmpty(code) || StringUtils.isEmpty(mobileKey)) { extJsObject.setSuccess(false); extJsObject.setMsg("驗證碼不能為空"); } else { //判斷驗證碼是否正確, 兩重判斷,session中和map集合中的 HttpSession session = request.getSession(); if (code.equalsIgnoreCase(session.getAttribute(Constants.TICKET + mobileKey).toString()) && code.equalsIgnoreCase(CaptchaController.getVcode(mobileKey))) { CaptchaController.removeVcode(mobileKey); extJsObject.setSuccess(true); extJsObject.setMsg("驗證碼正確"); } else { extJsObject.setSuccess(false); extJsObject.setMsg("驗證碼錯誤"); } } return extJsObject; } /** * 設置輸出流響應頭 */ private void setResponseHeader(HttpServletResponse response) { response.setContentType("image/png"); response.setHeader("cache", "no-cache"); response.setContentType("image/png"); response.setHeader("Cache-Control", "no-cache, no-store"); response.setHeader("Pragma", "no-cache"); long time = System.currentTimeMillis(); response.setDateHeader("Last-Modified", time); response.setDateHeader("Date", time); response.setDateHeader("Expires", time); }}

這里因為在前端會帶一個隨機碼參數過來,所以做了雙重驗證,更加安全;另外,大家還可以寫一個定時任務,每天清一次map中的所有key,防止占用過多的內存;好了,就簡單介紹到這兒了,大家可以去試一試!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品白嫩初高中害羞小美女| 大胆人体色综合| 日韩av片免费在线观看| 亚洲成人久久久久| 欧美色图在线视频| 亚洲男人天堂2023| 亚洲天堂av综合网| 最近2019中文免费高清视频观看www99| 亚洲人成绝费网站色www| 国产一区二区三区毛片| 亚洲色图国产精品| 欧日韩在线观看| 国产精品久久久久国产a级| 九九精品视频在线| 成人有码视频在线播放| 亚洲第一中文字幕| 免费91麻豆精品国产自产在线观看| 国产精品视频精品视频| 亚洲美腿欧美激情另类| 久久久国产精品免费| 久久香蕉精品香蕉| 欧美激情精品久久久久久久变态| 亚洲激情视频在线播放| xvideos亚洲人网站| 在线观看日韩av| 国产精品6699| 亚洲精品免费一区二区三区| 91社影院在线观看| 2019中文在线观看| 欧美特黄级在线| 91a在线视频| 成人黄色影片在线| 亚洲精品免费网站| 亚洲自拍偷拍网址| 久久久女人电视剧免费播放下载| 日韩电影中文字幕在线观看| 91av在线影院| 亚洲精品国产品国语在线| 亚洲一区中文字幕| www.亚洲成人| 色妞在线综合亚洲欧美| 国产日韩综合一区二区性色av| 不卡av电影在线观看| 国产精自产拍久久久久久| 亚洲色图色老头| 国产成人精品视频| 欧美丝袜第一区| 国产欧美日韩91| 黄色一区二区三区| 久热精品视频在线| 亚洲新中文字幕| 成人福利网站在线观看11| 国产69精品久久久久99| 国产婷婷成人久久av免费高清| 最好看的2019的中文字幕视频| 久久精品2019中文字幕| 亚洲欧美日韩一区在线| 91亚洲精华国产精华| 国产精品入口日韩视频大尺度| 久久久亚洲国产| 亚洲精品国产suv| 麻豆国产精品va在线观看不卡| 亚洲国产成人91精品| 91国偷自产一区二区三区的观看方式| 国产精品网站大全| 日韩av中文字幕在线免费观看| 亚洲精品国产精品久久清纯直播| 日韩福利伦理影院免费| 国产精品久久二区| 亚洲午夜av久久乱码| 亚洲日本欧美日韩高观看| 国产91在线播放| 美女视频黄免费的亚洲男人天堂| 久久艳片www.17c.com| 最近2019中文字幕大全第二页| 成人激情视频网| 精品久久香蕉国产线看观看gif| 热久久美女精品天天吊色| 性夜试看影院91社区| 91九色视频在线| 亚洲国产精品成人一区二区| 久久久国产一区二区三区| 97久久久久久| 国产精品视频999| 精品久久久久久久久久ntr影视| 欧美激情二区三区| 51精品在线观看| 这里精品视频免费| 91日本在线观看| 欧美国产日韩精品| 国产欧美日韩免费看aⅴ视频| 国产精品最新在线观看| 日本久久久久久| 91欧美激情另类亚洲| 久久亚洲精品小早川怜子66| 国产精品免费福利| 亚洲午夜久久久久久久| 亚洲高清久久网| 国产v综合v亚洲欧美久久| 69av成年福利视频| 日韩一区二区久久久| www.99久久热国产日韩欧美.com| 国产精品久久久久久久久久久久久久| 最近2019中文字幕第三页视频| 欧美精品日韩三级| 欧美大肥婆大肥bbbbb| 国产精品嫩草影院久久久| 久久久精品影院| 亚洲精品一区二区三区不| 日本老师69xxx| 亚洲精品第一页| 97精品视频在线| 久久久久久久久国产| 久久香蕉精品香蕉| 日韩有码片在线观看| 欧美黑人一区二区三区| 日韩少妇与小伙激情| 亚洲性视频网址| 在线观看国产成人av片| 国产一区二区色| 亚洲三级黄色在线观看| 国产第一区电影| 欧美夫妻性视频| 亚洲天堂av在线播放| 欧美日本中文字幕| 日本不卡高字幕在线2019| 午夜精品一区二区三区在线播放| 91精品免费久久久久久久久| 97国产精品久久| 欧美成人免费观看| 一区二区三区美女xx视频| 亚洲无线码在线一区观看| 韩国19禁主播vip福利视频| 国产精品白丝av嫩草影院| 亚洲码在线观看| 亚洲人成77777在线观看网| 九九九久久国产免费| 亚洲免费精彩视频| 伊人久久大香线蕉av一区二区| 国产亚洲福利一区| 国产精品一区二区3区| 欧美午夜激情小视频| 国产精品久久久久久久久久久久| 中文国产亚洲喷潮| 韩国精品久久久999| 性欧美暴力猛交69hd| 亚洲二区中文字幕| 在线观看日韩www视频免费| 欧美日韩激情小视频| 欧美二区在线播放| 国产精品成人一区二区| 久久精品国产69国产精品亚洲| 精品欧美激情精品一区| 欧美性猛交xxxx乱大交| 一本色道久久88综合亚洲精品ⅰ| 欧美多人爱爱视频网站| 色综合视频一区中文字幕| 久久久精品久久| 成人亚洲综合色就1024| 久久久久久亚洲精品不卡| 亚洲欧美三级在线| 欧美激情欧美激情| 国产精品视频免费在线观看| 国产福利成人在线|