Spring Boot 验证码的生成和验证详解

网友投稿 363 2023-05-08


Spring Boot 验证码的生成和验证详解

前言

本文介绍的imagecode方法是一个生成图形验证码的请求,checkcode方法实现了对这个图形验证码的验证。从验证码的生成到验证的过程中,验证码是通过Session来保存的,并且设定一个验证码的最长有效时间为5分钟。验证码的生成规则是从0~9的数字中,随机产生一个4位数,并增加一些干扰元素,最终组合成为一个图形输出

1、验证码生成类

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.OutputStream;import java.util.HashMap;

import java.util.Map;import java.util.Random;

public class ImageCode {

private static char mapTable[] = {

'0', '1', '2', '3', '4', '5',

'6', '7', '8', '9', '0', '1',

'2', '3', '4', '5', '6', '7',

'8', '9'};

public static Map getImageCode(int width, int height, OutputStream os) {

Map returnMap = new HashMap();

if (width <= 0) width = 60;

if (height <= 0) height = 20;

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文

Graphics g = image.getGraphics();

//生成随机类

Random random = new Random();

// 设定背景色

g.setColor(getRandColor(200, 250));

g.fillRect(0, 0, width, height);

//设定字体

g.setFont(new Font("Times New Roman", Font.PLAIN, 18));

// 随机产生168条干扰线,使图象中的认证码不易被其它程序探测到

g.setColor(getRandColor(160, 200));

for (int i = 0; i < 168; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

g.drawLine(x, y, x + xl, y + yl);

}

//取随机产生的码

String strEnsure = "";

//4代表4位验证码,如果要生成更多位的认证码,则加大数值

for (int i = 0; i < 4; ++i) {

strEnsure += mapTable[(int) (mapTable.length * Math.random())];

// 将认证码显示到图象中

g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));

//直接生成

String str = strEnsure.substring(i, i + 1);

g.drawString(str, 13 * i + 6, 16);

}

// 释放图形上下文

g.dispose();

returnMap.put("image",image);

returnMap.put("strEnsure",strEnsure);

return returnMap;

}

//给定范围获得随机颜色

static Color getRandColor(int fc, int bc) {

Random random = new Random();

if (fc > 255) fc = 255;

if (bc > 255) bc = 255;

int r = fc + random.nextInt(bc - fc);

int g = fc + random.nextInt(bc - fc);

int b = fc + random.nextInt(bc - fc);

return new Color(r, g, b);

}

}

2、获取验证码Ahttp://PI

@RequestMapping(value = "/images/imagecode")

public String imagecode(HttpServletRequest request, HttpServletResponse response) throws Exception {

OutputStream os = response.getOutputStream();

Map map = ImageCode.getImageCode(60, 20, os);

String simpleCaptcha = "simpleCaptcha";

request.getSession().setAttribute(simpleCaptcha, map.get("strEnsure").toString().toLowerCase());

request.getSession().setAttribute("codeTime",new Date().getTime());

try {

ImageIO.write((BufferedImage) map.get("image"), "JPEG", os);

} catch (IOException e) {

return "";

}

return null;

}

3、验证验证码API

@RequestMapping(value = "/checkcode")

@ResponseBody

public String checkcode(HttpServletRequest request, HttpSession session) throws Exception {

String checkCode = request.getParameter("checkCode");

Object cko = session.getAttribute("simpleCaptcha") ; //验证码对象

if(cko == null){

request.setAttribute("errorMsg", "验证码已失效,请重新输入!");

return "验证码已失效,请重新输入!";

}

String captcha = cko.toString();

Date now = new Date();

Long codeTime = Long.valueOf(session.getAttribute("codeTime")+"");

if(StringUtils.isEmpty(checkCode) || captcha == null || !(checkCode.equalsIgnoreCase(captcha))) {

request.setAttribute("errorMsg", "验证码错误!");

return "验证码错误!";

} else if ((now.getTime()-codeTime)/1000/60>5) {

//验证码有效时长为5分钟

request.setAttribute("errorMsg", "验证码已失效,请重新输入!");

return "验证码已失效,请重新输入!";

}else {

session.removeAttribute("simpleCaptcha");

return "1";

}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


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

上一篇:Spring Boot中防止递归查询的两种方式
下一篇:Java concurrency集合之ConcurrentSkipListSet_动力节点Java学院整理
相关文章

 发表评论

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