日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot登錄驗證碼實現過程詳解

瀏覽:22日期:2023-05-24 14:19:53

今天記錄一下驗證碼的實現,希望能夠幫助到大家!

首先我們看一下實現的效果:

SpringBoot登錄驗證碼實現過程詳解

此驗證碼的實現沒有用到太多的插件,話不多說直接上代碼,大家拿過去就可以用。

中間用到了org.apache.commons.lang3.RandomUtils工具類,需要pom配置:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency>

1.驗證碼類

package com.youyou.login.util.validatecode;import lombok.Data;/*** 驗證碼類*/public class VerifyCode { private String code; private byte[] imgBytes; private long expireTime; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public byte[] getImgBytes() { return imgBytes; } public void setImgBytes(byte[] imgBytes) { this.imgBytes = imgBytes; } public long getExpireTime() { return expireTime; } public void setExpireTime(long expireTime) { this.expireTime = expireTime; }}

2.驗證碼生成接口

package com.youyou.login.util.validatecode;import java.io.IOException;import java.io.OutputStream;/*** 驗證碼生成接口*/public interface IVerifyCodeGen {/*** 生成驗證碼并返回code,將圖片寫的os中** @param width* @param height* @param os* @return* @throws IOException*/String generate(int width, int height, OutputStream os) throws IOException;/*** 生成驗證碼對象** @param width* @param height* @return* @throws IOException*/VerifyCode generate(int width, int height) throws IOException;}

3.驗證碼生成實現類

package com.youyou.login.util.validatecode;import com.youyou.util.RandomUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Random;/*** 驗證碼實現類*/public class SimpleCharVerifyCodeGenImpl implements IVerifyCodeGen {private static final Logger logger = LoggerFactory.getLogger(SimpleCharVerifyCodeGenImpl.class);private static final String[] FONT_TYPES = { 'u5b8bu4f53', 'u65b0u5b8bu4f53', 'u9ed1u4f53', 'u6977u4f53', 'u96b6u4e66' };private static final int VALICATE_CODE_LENGTH = 4;/*** 設置背景顏色及大小,干擾線** @param graphics* @param width* @param height*/private static void fillBackground(Graphics graphics, int width, int height) {// 填充背景graphics.setColor(Color.WHITE);//設置矩形坐標x y 為0graphics.fillRect(0, 0, width, height);// 加入干擾線條for (int i = 0; i < 8; i++) {//設置隨機顏色算法參數graphics.setColor(RandomUtils.randomColor(40, 150));Random random = new Random();int x = random.nextint(width);int y = random.nextint(height);int x1 = random.nextint(width);int y1 = random.nextint(height);graphics.drawLine(x, y, x1, y1);}}/*** 生成隨機字符** @param width* @param height* @param os* @return* @throws IOException*/@Overridepublic String generate(int width, int height, OutputStream os) throws IOException {BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.getGraphics();fillBackground(graphics, width, height);String randomStr = RandomUtils.randomString(VALICATE_CODE_LENGTH);createCharacter(graphics, randomStr);graphics.dispose();//設置JPEG格式ImageIO.write(image, 'JPEG', os);return randomStr;}/*** 驗證碼生成** @param width* @param height* @return*/@Overridepublic VerifyCode generate(int width, int height) {VerifyCode verifyCode = null;try (//將流的初始化放到這里就不需要手動關閉流ByteArrayOutputStream baos = new ByteArrayOutputStream();) {String code = generate(width, height, baos);verifyCode = new VerifyCode();verifyCode.setCode(code);verifyCode.setImgBytes(baos.toByteArray());}catch (IOException e) {logger.error(e.getMessage(), e);verifyCode = null;}return verifyCode;}/*** 設置字符顏色大小** @param g* @param randomStr*/private void createCharacter(Graphics g, String randomStr) {char[] charArray = randomStr.toCharArray();for (int i = 0; i < charArray.length; i++) {//設置RGB顏色算法參數g.setColor(new Color(50 + RandomUtils.nextint(100),+ RandomUtils.nextint(100), 50 + RandomUtils.nextint(100)));//設置字體大小,類型g.setFont(new Font(FONT_TYPES[RandomUtils.nextint(FONT_TYPES.length)], Font.BOLD, 26));//設置x y 坐標g.drawString(String.valueOf(charArray[i]), 15 * i + 5, 19 + RandomUtils.nextint(8));}}}

4.工具類

package com.youyou.util;import java.awt.*;import java.util.Random;public class RandomUtils extends org.apache.commons.lang3.RandomUtils {private static final char[] CODE_SEQ = { ’A’, ’B’, ’C’, ’D’, ’E’, ’F’, ’G’, ’H’, ’J’,’K’, ’L’, ’M’, ’N’, ’P’, ’Q’, ’R’, ’S’, ’T’, ’U’, ’V’, ’W’,’X’, ’Y’, ’Z’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’ };private static final char[] NUMBER_ARRAY = { ’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’ };private static Random random = new Random();public static String randomString(int length) {StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {sb.append(String.valueOf(CODE_SEQ[random.nextint(CODE_SEQ.length)]));}return sb.toString();}public static String randomNumberString(int length) {StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {sb.append(String.valueOf(NUMBER_ARRAY[random.nextint(NUMBER_ARRAY.length)]));}return sb.toString();}public static Color randomColor(int fc, int bc) {int f = fc;int b = bc;Random random = new Random();if (f > 255) {f = 255;}if (b > 255) {b = 255;}return new Color(f + random.nextint(b - f), f + random.nextint(b - f), f + random.nextint(b - f));}public static int nextint(int bound) {return random.nextint(bound);}}

經過以上代碼,我們的驗證碼生成功能基本上已經實現了,現在還需要一個controller來調用它。

@ApiOperation(value = '驗證碼')@GetMapping('/verifyCode')public void verifyCode(HttpServletRequest request, HttpServletResponse response) {IVerifyCodeGen iVerifyCodeGen = new SimpleCharVerifyCodeGenImpl();try {//設置長寬VerifyCode verifyCode = iVerifyCodeGen.generate(80, 28);String code = verifyCode.getCode();LOGGER.info(code);//將VerifyCode綁定sessionrequest.getSession().setAttribute('VerifyCode', code);//設置響應頭response.setHeader('Pragma', 'no-cache');//設置響應頭response.setHeader('Cache-Control', 'no-cache');//在代理服務器端防止緩沖response.setDateHeader('Expires', 0);//設置響應內容類型response.setContentType('image/jpeg');response.getOutputStream().write(verifyCode.getImgBytes());response.getOutputStream().flush();}catch (IOException e) {LOGGER.info('', e);}}

搞定!后臺編寫到此結束了。那么又會有博友說了:“說好的實現效果呢?”

好吧,那么我們繼續前端的代碼編寫。

前端代碼:

<html><body><div><input placeholder='驗證碼' type='text' class=''style='width:170px'><!-- 驗證碼 顯示 --><img οnclick='javascript:getvCode()' /></div><script type='text/javascript'>getvCode();/*** 獲取驗證碼* 將驗證碼寫到login.html頁面的id = verifyimg 的地方*/function getvCode() {document.getElementById('verifyimg').src = timestamp('http://127.0.0.1:81/verifyCode');}//為url添加時間戳function timestamp(url) {var getTimestamp = new Date().getTime();if (url.indexOf('?') > -1) {url = url + '&timestamp=' + getTimestamp} else {url = url + '?timestamp=' + getTimestamp}return url;};</script></body></html>

可以實現點擊圖片更換驗證碼。

實現效果:

SpringBoot登錄驗證碼實現過程詳解

當然文章開頭的截圖是我系統中的截圖,需要大家自己去根據自己的情況去開發前端了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲丝袜啪啪| 你懂的国产精品永久在线| 日韩精品影视| 精品一区免费| 综合激情一区| 国产精品1区| 日韩精品久久久久久久电影99爱| 狠狠操综合网| 日日夜夜免费精品视频| 亚洲男人在线| 精品久久久中文字幕| 久久精品国产亚洲夜色av网站| 99香蕉国产精品偷在线观看| 日韩精彩视频在线观看| 老色鬼精品视频在线观看播放| av一区在线| 免费精品视频在线| 精品日韩一区| 亚洲综合国产| 欧美极品中文字幕| 激情久久久久久久| 欧美亚洲tv| 久久激情一区| 欧美三级第一页| 三级在线看中文字幕完整版| 制服诱惑一区二区| 国产精品久久乐| 精品在线播放| 欧美偷窥清纯综合图区| 日韩欧美国产精品综合嫩v| 丝袜美腿亚洲一区| 精品久久久网| 中文国产一区| 国产一区二区色噜噜| 亚洲在线免费| 国产精品成人a在线观看| 蜜桃久久av| 亚洲综合电影| 久久狠狠久久| 女主播福利一区| 久久男人av| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品久久久久蜜臀| 亚洲三级av| 日韩成人亚洲| 国产精品第一国产精品| 午夜亚洲福利在线老司机| av在线最新| 国产剧情一区| 亚洲人成亚洲精品| 婷婷激情综合| 日韩精品第一区| 国产精品九九| 日本一区福利在线| 亚洲女同一区| 亚洲精品成人图区| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩中文字幕亚洲一区二区va在线| 免费高潮视频95在线观看网站| 国产日韩一区二区三区在线| 伊人久久大香线蕉av超碰演员| 色婷婷色综合| 欧美国产另类| 久久激情av| 日韩欧美中文字幕一区二区三区| 精品一区在线| 日韩一区二区三区在线免费观看| 精品亚洲免a| 国产乱人伦丫前精品视频| 国产精品呻吟| 播放一区二区| 色婷婷亚洲mv天堂mv在影片| 久久99久久久精品欧美| 色综合视频一区二区三区日韩 | 亚洲综合中文| 中文一区二区| 不卡在线一区二区| 日韩中文影院| 在线天堂中文资源最新版| 久久精品国产亚洲一区二区三区| 国产日韩欧美一区二区三区在线观看| 亚洲日产av中文字幕| 首页欧美精品中文字幕| 亚洲色诱最新| 欧美日韩国产综合网| 欧美一区二区三区激情视频 | 久久一区二区三区电影| 国产一二在线播放| 成人在线免费观看91| 美女免费视频一区| 红杏一区二区三区| 欧美激情在线精品一区二区三区| 国产亚洲一区二区三区不卡| 久久国产生活片100| 欧美日韩在线精品一区二区三区激情综合| 日韩一区二区三区在线看| 亚洲1区在线| 日本一不卡视频| 国产调教一区二区三区| 国产精品久久久一区二区| 麻豆成人在线观看| 成人国产精选| 欧洲一级精品| 999国产精品永久免费视频app| 国产亚洲一区二区手机在线观看| 999精品一区| 久久影视一区| 九九综合在线| 亚洲在线久久| 国产欧美日韩一级| 久久久久97| 伊人久久在线| 欧美.日韩.国产.一区.二区| 欧美在线亚洲| 亚洲精品伊人| 国产欧美在线| 日本一区二区高清不卡| 亚洲一级少妇| av不卡在线| 亚洲精品在线二区| 国产精品porn| 色在线中文字幕| 亚洲一级网站| 少妇精品久久久一区二区| 国产精品视频一区二区三区| 福利一区二区三区视频在线观看| 久久精品亚洲欧美日韩精品中文字幕| 免费精品国产| 亚洲精品伊人| 国产一区调教| 黄色欧美日韩| 国产日产高清欧美一区二区三区 | 亚洲综合激情在线| 麻豆一区二区三| 成人日韩在线| 免费看欧美美女黄的网站| 国产精品久久久久77777丨| 在线观看精品| 免费在线观看不卡| 红杏一区二区三区| 日韩一级欧洲| 欧美国产精品| 狠狠爱成人网| 国产精品亚洲二区| 久久高清免费| 日韩精品社区| 毛片在线网站| 亚洲精品看片| 日韩国产欧美| 亚洲一级淫片| 精品一区二区男人吃奶| 日韩视频二区| 久久99精品久久久久久园产越南 | 噜噜噜躁狠狠躁狠狠精品视频| 国产欧美日韩精品高清二区综合区 | 精品视频一区二区三区在线观看 | 久久久久国产精品一区二区| 亚洲一级淫片| 亚洲精品福利电影| 午夜天堂精品久久久久| 秋霞影院一区二区三区| 青青草视频一区| 亚洲成人二区| 欧美视频精品全部免费观看| 欧美~级网站不卡| 国产精品毛片视频| 亚洲免费一区二区| 国产精品99久久精品| 日韩一区二区三区免费视频| 999国产精品视频| 久久只有精品| 日本99精品| 在线亚洲激情| 日韩一区二区中文| 日韩一区免费| 国产精品三上| se01亚洲视频 | 欧美日韩18| 亚洲欧洲一区| 日韩欧美视频专区| 国产乱人伦精品一区| 久久亚洲风情| 亚洲精品一区三区三区在线观看| 国产精品麻豆成人av电影艾秋| 国产精品人人爽人人做我的可爱| 给我免费播放日韩视频| 日韩中文字幕| 亚洲黄色在线| 久久蜜桃精品| 精品欠久久久中文字幕加勒比| 青青草精品视频| 丝袜美腿亚洲色图| 久久人人99| 国产在线观看www| 美女在线视频一区| 日韩av一区二区三区四区| 视频在线在亚洲| 亚洲精品2区| 国产一级成人av| av在线最新|