色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

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

瀏覽:4日期: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)文章:
主站蜘蛛池模板: 久久精品国产福利 | 在线日韩欧美一区二区三区 | 午夜三级在线观看 | 久久免费精品一区二区 | 国产91香蕉在线精品 | 免费中国一级啪啪片 | 亚洲精品国产一区二区图片欧美 | 国产精品久久做爰 | 亚洲成人黄色片 | 国自产精品手机在线视频香蕉 | 亚洲日韩中文字幕在线播放 | 国产精品久久久久免费a∨ 国产精品久久久久免费视频 | 怡红院免费全部视频在线 | 精品久久久久久综合网 | 亚洲国产成人麻豆精品 | 一区二区欧美视频 | 日韩精品网 | 亚洲精品xxxx | 国产萌白酱在线一区二区 | 多人伦精品一区二区三区视频 | 孕妇交| 久久爱噜噜噜噜久久久网 | 日韩三级一区 | 一级黄色免费网站 | 欧美xx在线观看 | 欧美aaa级| 国产精品三级a三级三级午夜 | 精品国产成人综合久久小说 | 黄色美女毛片 | 精品国产一区二区三区国产馆 | 91免费看国产 | 国产欧美日韩综合精品一区二区 | 最新国产中文字幕 | 久久亚洲国产的中文 | a国产视频| 日韩一区二区天海翼 | 女人张开腿给男人桶爽免费 | 成年片免费网址网站 | 香蕉视频1024 | 2020久久国产最新免费观看 | 成年女人毛片 |