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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot 圖形驗(yàn)證碼的生成和校驗(yàn)

瀏覽:22日期:2023-03-09 09:53:12
目錄1. 編寫工具類2. 編寫 Controller 中的接口3. 獲取驗(yàn)證碼圖片另一種方法1.添加依賴2.全部代碼1. 編寫工具類

package com.cn.beauty.util;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.awt.*;import java.awt.image.BufferedImage;import java.util.ArrayList;import java.util.Random;public class RandomValidateCodeUtil { public static final String RANDOMCODEKEY = 'MEISHANG-LOGIN-RANDOMVALIDATECODEKEY';//放到session中的key private String randString = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';//隨機(jī)產(chǎn)生數(shù)字與字母組合的字符串 private int width = 95;// 圖片寬 private int height = 40;// 圖片高 private int stringNum = 4;// 隨機(jī)產(chǎn)生字符數(shù)量 private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class); private Random random = new Random(); /** * 獲得字體 */ private Font getFont() {return new Font('Wide Latin', Font.PLAIN, 18); } /** * 獲得顏色(粉色為主) */ private Color getRandColor() {ArrayList<Color> colors = new ArrayList<Color>();colors.add(new Color(241, 158, 194));colors.add(new Color(255, 94, 226));colors.add(new Color(255, 156, 177));colors.add(new Color(245, 152, 217));colors.add(new Color(255, 85, 81));colors.add(new Color(245, 152, 251));int num = random.nextInt(6);return colors.get(num); } /** * 生成隨機(jī)圖片 */ public void getRandcode(HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();// BufferedImage類是具有緩沖區(qū)的Image類,Image類是用于描述圖像信息的類BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();// 產(chǎn)生Image對(duì)象的Graphics對(duì)象,改對(duì)象可以在圖像上進(jìn)行各種繪制操作g.fillRect(0, 0, width, height);//圖片大小g.setFont(new Font('Wide Latin', Font.PLAIN, 18));//字體大小g.setColor(getRandColor());//字體顏色// 添加噪點(diǎn)float yawpRate = 0.01f;// 噪聲率int area = (int) (yawpRate * width * height);for (int i = 0; i < area; i++) { int x = random.nextInt(width); int y = random.nextInt(height); image.setRGB(x, y, random.nextInt(255));}// 繪制隨機(jī)字符String randomString = '';for (int i = 1; i <= stringNum; i++) { randomString = drowString(g, randomString, i);}logger.info(randomString);//將生成的隨機(jī)字符串保存到session中session.removeAttribute(RANDOMCODEKEY);session.setAttribute(RANDOMCODEKEY, randomString);g.dispose();try { // 將內(nèi)存中的圖片通過(guò)流動(dòng)形式輸出到客戶端 ImageIO.write(image, 'JPEG', response.getOutputStream());} catch (Exception e) { logger.error('將內(nèi)存中的圖片通過(guò)流動(dòng)形式輸出到客戶端失敗>>>> ', e);} } /** * 繪制字符串 */ private String drowString(Graphics g, String randomString, int i) {g.setFont(getFont());g.setColor(getRandColor());String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));randomString += rand;g.translate(random.nextInt(3), random.nextInt(3));g.drawString(rand, 20 * (i - 1) + 3, 25);return randomString; } /** * 獲取隨機(jī)的字符 */ public String getRandomString(int num) {return String.valueOf(randString.charAt(num)); }}2. 編寫 Controller 中的接口

/** * @description 生成驗(yàn)證碼 */@RequestMapping(value = '/user/getVerify')public void getVerify(HttpServletRequest request, HttpServletResponse response) { try {//設(shè)置相應(yīng)類型,告訴瀏覽器輸出的內(nèi)容為圖片response.setContentType('image/jpeg');//設(shè)置響應(yīng)頭信息,告訴瀏覽器不要緩存此內(nèi)容response.setHeader('Pragma', 'No-cache');response.setHeader('Cache-Control', 'no-cache');response.setDateHeader('Expire', 0);RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();//輸出驗(yàn)證碼圖片方法randomValidateCode.getRandcode(request, response); } catch (Exception e) {log.error('獲取驗(yàn)證碼失敗>>>>', e); }}/** * @description 校驗(yàn)驗(yàn)證碼 */@PostMapping('/user/checkVerify')public boolean checkVerify(@RequestParam String verifyInput, HttpSession session) { try {// 從session中獲取隨機(jī)數(shù)String inputStr = verifyInput;String random = (String) session.getAttribute('MEISHANG-LOGIN-RANDOMVALIDATECODEKEY');if (random == null) { return false;}if (random.equalsIgnoreCase(inputStr)) { return true;} else { return false;} } catch (Exception e) {log.error('驗(yàn)證碼校驗(yàn)失敗', e);return false; }}3. 獲取驗(yàn)證碼圖片

訪問(wèn)獲取驗(yàn)證碼接口

http://127.0.0.1:8605/user/getVerify

效果如下

SpringBoot 圖形驗(yàn)證碼的生成和校驗(yàn)

另一種方法1.添加依賴

<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>

項(xiàng)目結(jié)構(gòu)

SpringBoot 圖形驗(yàn)證碼的生成和校驗(yàn)

2.全部代碼

UserController

package com.yzm.config;import java.util.HashMap;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.google.code.kaptcha.impl.DefaultKaptcha;import com.yzm.utils.Util;@Controllerpublic class TestControler { @Resource private DefaultKaptcha captchaProducer; /** * 登錄驗(yàn)證碼SessionKey */ public static final String LOGIN_VALIDATE_CODE = 'login_validate_code'; /** * 登錄驗(yàn)證碼圖片 */ @RequestMapping(value = {'/loginValidateCode'}) public void loginValidateCode(HttpServletRequest request, HttpServletResponse response) throws Exception{Util.validateCode(request,response,captchaProducer,LOGIN_VALIDATE_CODE); } /** * 檢查驗(yàn)證碼是否正確 */ @RequestMapping('/checkLoginValidateCode') @ResponseBody public HashMap checkLoginValidateCode(HttpServletRequest request,@RequestParam('validateCode')String validateCode) {String loginValidateCode = request.getSession().getAttribute(LOGIN_VALIDATE_CODE).toString();HashMap<String,Object> map = new HashMap<String,Object>();if(loginValidateCode == null){ map.put('status',null);//驗(yàn)證碼過(guò)期}else if(loginValidateCode.equals(validateCode)){ map.put('status',true);//驗(yàn)證碼正確}else if(!loginValidateCode.equals(validateCode)){ map.put('status',false);//驗(yàn)證碼不正確}map.put('code',200);return map; }}package com.yzm.controller;import java.util.Properties;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import com.google.code.kaptcha.impl.DefaultKaptcha;import com.google.code.kaptcha.util.Config;@Componentpublic class TestConfig { @Bean public DefaultKaptcha getDefaultKaptcha() {DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();// 圖片邊框properties.setProperty('kaptcha.border', 'no');// 邊框顏色properties.setProperty('kaptcha.border.color', 'black');//邊框厚度properties.setProperty('kaptcha.border.thickness', '1');// 圖片寬properties.setProperty('kaptcha.image.width', '200');// 圖片高properties.setProperty('kaptcha.image.height', '50');//圖片實(shí)現(xiàn)類properties.setProperty('kaptcha.producer.impl', 'com.google.code.kaptcha.impl.DefaultKaptcha');//文本實(shí)現(xiàn)類properties.setProperty('kaptcha.textproducer.impl', 'com.google.code.kaptcha.text.impl.DefaultTextCreator');//文本集合,驗(yàn)證碼值從此集合中獲取properties.setProperty('kaptcha.textproducer.char.string', '01234567890');//驗(yàn)證碼長(zhǎng)度properties.setProperty('kaptcha.textproducer.char.length', '4');//字體properties.setProperty('kaptcha.textproducer.font.names', '宋體');//字體顏色properties.setProperty('kaptcha.textproducer.font.color', 'black');//文字間隔properties.setProperty('kaptcha.textproducer.char.space', '5');//干擾實(shí)現(xiàn)類properties.setProperty('kaptcha.noise.impl', 'com.google.code.kaptcha.impl.DefaultNoise');//干擾顏色properties.setProperty('kaptcha.noise.color', 'blue');//干擾圖片樣式properties.setProperty('kaptcha.obscurificator.impl', 'com.google.code.kaptcha.impl.WaterRipple');//背景實(shí)現(xiàn)類properties.setProperty('kaptcha.background.impl', 'com.google.code.kaptcha.impl.DefaultBackground');//背景顏色漸變,結(jié)束顏色properties.setProperty('kaptcha.background.clear.to', 'white');//文字渲染器properties.setProperty('kaptcha.word.impl', 'com.google.code.kaptcha.text.impl.DefaultWordRenderer');Config config = new Config(properties);defaultKaptcha.setConfig(config);return defaultKaptcha; } }

Util

package com.yzm.utils;import java.awt.image.BufferedImage;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.google.code.kaptcha.impl.DefaultKaptcha;public class Util { /** * 生成驗(yàn)證碼圖片 * @param request 設(shè)置session * @param response 轉(zhuǎn)成圖片 * @param captchaProducer 生成圖片方法類 * @param validateSessionKey session名稱 * @throws Exception */ public static void validateCode(HttpServletRequest request, HttpServletResponse response, DefaultKaptcha captchaProducer, String validateSessionKey) throws Exception{// Set to expire far in the past.response.setDateHeader('Expires', 0);// Set standard HTTP/1.1 no-cache headers.response.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');// Set IE extended HTTP/1.1 no-cache headers (use addHeader).response.addHeader('Cache-Control', 'post-check=0, pre-check=0');// Set standard HTTP/1.0 no-cache header.response.setHeader('Pragma', 'no-cache'); // return a jpegresponse.setContentType('image/jpeg'); // create the text for the imageString capText = captchaProducer.createText(); // store the text in the sessionrequest.getSession().setAttribute(validateSessionKey, capText); // create the image with the textBufferedImage bi = captchaProducer.createImage(capText); ServletOutputStream out = response.getOutputStream(); // write the data outImageIO.write(bi, 'jpg', out);try { out.flush();} finally { out.close();} }}

以上就是SpringBoot 圖形驗(yàn)證碼的生成和校驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 驗(yàn)證碼的生成和校驗(yàn)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品资源| 国产在线不卡一区二区三区| 99久久视频| 视频小说一区二区| 色综合www| 欧美日韩激情| 伊人影院久久| 日韩综合一区二区三区| 国产欧美亚洲精品a| 久久av偷拍| 国产精品欧美在线观看| 精品一区二区男人吃奶 | 国产精品亚洲产品| 久久99免费视频| 久久久久久色| 久久精品97| 美女精品久久| 日韩国产欧美| 国产一区久久| 在线精品亚洲| 国产欧美日韩精品一区二区三区 | 日本va欧美va瓶| 国产女人18毛片水真多18精品| 久久99视频| 亲子伦视频一区二区三区| 亚洲激情社区| 国产日韩欧美在线播放不卡| 91亚洲国产| 久久最新视频| 久久影视三级福利片| 国产 日韩 欧美一区| 一本一本久久| 国产精品任我爽爆在线播放| 日韩欧美一区二区三区在线观看| 亚洲成人精选| 日韩中文字幕无砖| 国产精品久久久网站| 精品捆绑调教一区二区三区| 久久国产精品毛片| 麻豆精品在线| 一本一道久久a久久精品蜜桃| 日韩美女精品| 日韩欧美一区二区三区在线视频 | 国产欧美日韩一区二区三区四区 | 久久国产99| 欧美黑人做爰爽爽爽| 欧美日韩精品免费观看视完整 | 亚洲精品中文字幕乱码| 国产亚洲精品美女久久久久久久久久| 国产一区二区三区探花| 三级一区在线视频先锋| 美女尤物国产一区| 黄色在线一区| 久久精品国产在热久久| 亚洲一区二区三区高清| 精品三区视频| 国产精品免费看| 麻豆精品久久| 免费在线看一区| 高清不卡亚洲| 欧美一区精品| av不卡免费看| 成人精品国产亚洲| 日韩精品视频在线看| 成人久久一区| 欧美成人精品午夜一区二区| 国产一级久久| 日韩高清中文字幕一区二区| 日韩1区2区日韩1区2区| 99精品小视频| 免费在线亚洲欧美| 一区二区三区网站| av中文字幕在线观看第一页| 亚洲精品一级| 国产一在线精品一区在线观看| 久久中文字幕一区二区三区| 日韩中文一区二区| aⅴ色国产欧美| 色在线视频观看| 国产欧美69| 亚洲字幕久久| 免费黄色成人| 国产精品99久久精品| 国产亚洲欧美日韩在线观看一区二区| 亚洲激情社区| 私拍精品福利视频在线一区| 美女视频黄 久久| 日韩综合一区二区| 中文亚洲免费| 久久一级电影| 久久久久久色| 亚洲精品在线二区| 蜜桃国内精品久久久久软件9| 成人精品高清在线视频| 国产日韩精品视频一区二区三区| 久久av在线| 五月天久久网站| 人人精品亚洲| 亚洲精品一区三区三区在线观看| 国产在视频一区二区三区吞精| 国产三级一区| 日韩av黄色在线| 日韩精品一区第一页| 日韩高清中文字幕一区二区| 国产在线观看91一区二区三区| 国产精品羞羞答答在线观看| 91精品国产自产观看在线 | 精品国产18久久久久久二百| 国产调教精品| 青青草国产成人99久久| 日韩精品久久理论片| 亚洲一区有码| 日韩专区欧美专区| 日韩在线a电影| 综合国产在线| 亚洲一区激情| 乱人伦精品视频在线观看| 999在线观看精品免费不卡网站| 亚洲一级黄色| 好吊一区二区三区| 国产精品毛片在线看| 美女精品一区| 亚洲视频二区| 日韩黄色在线观看| 欧美日韩亚洲一区三区| 国产精品亚洲综合色区韩国| 捆绑调教美女网站视频一区| 精品国产美女a久久9999| 国内精品麻豆美女在线播放视频| 国产中文字幕一区二区三区| 麻豆国产精品| 国产suv精品一区| 日韩欧美精品| 蜜臀av免费一区二区三区| 99热精品在线| 亚洲色图网站| 久久国产三级精品| 老牛国内精品亚洲成av人片| 国产一区二区三区探花| 青青久久av| 欧美在线综合| 欧美久久久网站| 国产一区二区三区四区五区传媒| 亚洲天堂资源| 在线视频精品| 在线观看亚洲精品福利片| 97se亚洲| 国产传媒av在线| 女同性一区二区三区人了人一| 视频一区视频二区在线观看| 青青草精品视频| 国内精品麻豆美女在线播放视频| 亚洲www啪成人一区二区| 久久亚洲电影| 国产精品三p一区二区| 色在线视频观看| 美日韩精品视频| 国产精品欧美大片| 午夜欧美巨大性欧美巨大| 免费视频久久| 欧美日韩18| а√在线中文在线新版| 91久久黄色| 国产欧美一区二区精品久久久| 久久毛片亚洲| 男女性色大片免费观看一区二区| 国产麻豆精品久久| 成人精品天堂一区二区三区| 热久久国产精品| 国模大尺度视频一区二区| 国产精品丝袜xxxxxxx| 国产精品极品| 亚洲精品小说| 老鸭窝一区二区久久精品| 亚洲精品888| 青草国产精品| 欧美日韩色图| 国产亚洲久久| 欧美jjzz| 国产精品自在| 亚洲大全视频| 国产精品成人一区二区网站软件| 久久久人人人| 欧美精品中文| 亚洲国产一区二区在线观看 | 日韩精品永久网址| 免费在线欧美视频| 丁香婷婷久久| 五月亚洲婷婷 | 国产精品一区二区精品视频观看| 久久影院午夜精品| 日韩在线成人| 日韩啪啪电影网| 婷婷精品久久久久久久久久不卡| 日韩成人综合| 国产精品一线天粉嫩av| av不卡在线| 日韩深夜视频| 国产精品2区| 石原莉奈在线亚洲二区|