您的位置:首页技术文章
文章详情页

SpringBoot 图形验证码的生成和校验

【字号: 日期:2023-03-09 09:53:12浏览:2作者:猪猪
目录1. 编写工具类2. 编写 Controller 中的接口3. 获取验证码图片另一种方法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';//随机产生数字与字母组合的字符串 private int width = 95;// 图片宽 private int height = 40;// 图片高 private int stringNum = 4;// 随机产生字符数量 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); } /** * 生成随机图片 */ public void getRandcode(HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作g.fillRect(0, 0, width, height);//图片大小g.setFont(new Font('Wide Latin', Font.PLAIN, 18));//字体大小g.setColor(getRandColor());//字体颜色// 添加噪点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));}// 绘制随机字符String randomString = '';for (int i = 1; i <= stringNum; i++) { randomString = drowString(g, randomString, i);}logger.info(randomString);//将生成的随机字符串保存到session中session.removeAttribute(RANDOMCODEKEY);session.setAttribute(RANDOMCODEKEY, randomString);g.dispose();try { // 将内存中的图片通过流动形式输出到客户端 ImageIO.write(image, 'JPEG', response.getOutputStream());} catch (Exception e) { logger.error('将内存中的图片通过流动形式输出到客户端失败>>>> ', 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; } /** * 获取随机的字符 */ public String getRandomString(int num) {return String.valueOf(randString.charAt(num)); }}2. 编写 Controller 中的接口

/** * @description 生成验证码 */@RequestMapping(value = '/user/getVerify')public void getVerify(HttpServletRequest request, HttpServletResponse response) { try {//设置相应类型,告诉浏览器输出的内容为图片response.setContentType('image/jpeg');//设置响应头信息,告诉浏览器不要缓存此内容response.setHeader('Pragma', 'No-cache');response.setHeader('Cache-Control', 'no-cache');response.setDateHeader('Expire', 0);RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();//输出验证码图片方法randomValidateCode.getRandcode(request, response); } catch (Exception e) {log.error('获取验证码失败>>>>', e); }}/** * @description 校验验证码 */@PostMapping('/user/checkVerify')public boolean checkVerify(@RequestParam String verifyInput, HttpSession session) { try {// 从session中获取随机数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('验证码校验失败', e);return false; }}3. 获取验证码图片

访问获取验证码接口

http://127.0.0.1:8605/user/getVerify

效果如下

SpringBoot 图形验证码的生成和校验

另一种方法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>

项目结构

SpringBoot 图形验证码的生成和校验

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; /** * 登录验证码SessionKey */ public static final String LOGIN_VALIDATE_CODE = 'login_validate_code'; /** * 登录验证码图片 */ @RequestMapping(value = {'/loginValidateCode'}) public void loginValidateCode(HttpServletRequest request, HttpServletResponse response) throws Exception{Util.validateCode(request,response,captchaProducer,LOGIN_VALIDATE_CODE); } /** * 检查验证码是否正确 */ @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);//验证码过期}else if(loginValidateCode.equals(validateCode)){ map.put('status',true);//验证码正确}else if(!loginValidateCode.equals(validateCode)){ map.put('status',false);//验证码不正确}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');//图片实现类properties.setProperty('kaptcha.producer.impl', 'com.google.code.kaptcha.impl.DefaultKaptcha');//文本实现类properties.setProperty('kaptcha.textproducer.impl', 'com.google.code.kaptcha.text.impl.DefaultTextCreator');//文本集合,验证码值从此集合中获取properties.setProperty('kaptcha.textproducer.char.string', '01234567890');//验证码长度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');//干扰实现类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');//背景实现类properties.setProperty('kaptcha.background.impl', 'com.google.code.kaptcha.impl.DefaultBackground');//背景颜色渐变,结束颜色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 { /** * 生成验证码图片 * @param request 设置session * @param response 转成图片 * @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 图形验证码的生成和校验的详细内容,更多关于SpringBoot 验证码的生成和校验的资料请关注好吧啦网其它相关文章!

标签: Spring
相关文章: