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

网友投稿 227 2022-10-22


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

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 colors = new ArrayList();

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

效果如下

另一种方法

1.添加依赖

com.github.penggle

kaptcha

2.3.2

org.springframework.boot

spring-boot-starter-web

项目结构

2.全部代码

UserController

pacldnkVkage 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;

@Controller

public 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 map = new HashMap();

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;

@Component

public 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 jpeg

response.setContentType("image/jpeg");

// create the text for the image

String capText = captchaProducer.createText();

// store the text in the session

request.getSession().setAttribute(validateSessionKey, capText);

// create the image with the text

BufferedImage bi = captchaProducer.createImage(capText);

ServletOutputStream out = response.getOuhttp://tputStream();

// write the data out

ImageIO.write(bi, "jpg", out);

try {

out.flush();

} finally {

out.close();

}

}

}

以上就是SpringBoot 图形验证码的生成和校验的详细内容,更多关于SpringBoot 验证码的生成和校验的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:i.mx287学习笔记5-Time
下一篇:CentOS7 network.service loaded failed 处理技巧
相关文章

 发表评论

暂时没有评论,来抢沙发吧~