Springboot 验证码生成和校验,图片格式和base64编码串

randomStr += rand;

g.translate(random.nextInt(3), random.nextInt(6));

g.drawString(rand, 40 * i + 10, 25);

return randomStr;

}

//生成随机图片

public void getRandomCodeImage(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();

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

g.setColor(getRandomColor(105, 189));

g.setFont(getFont());

// 干扰线

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

drawLine(g);

}

// 随机字符

String randomStr = “”;

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

randomStr = drawString(g, randomStr, i);

}

System.out.println(“随机字符:”+randomStr);

g.dispose();

//移除之前的session中的验证码信息

session.removeAttribute(sessionKey);

//重新将验证码放入session

session.setAttribute(sessionKey, randomStr);

try {

// 将图片以png格式返回,返回的是图片

ImageIO.write(image, “PNG”, response.getOutputStream());

} catch (Exception e) {

e.printStackTrace();

}

}

//生成随机图片的base64编码字符串

public String getRandomCodeBase64(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();

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

g.setColor(getRandomColor(105, 189));

g.setFont(getFont());

//干扰线

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

drawLine(g);

}

//随机字符

String randomStr = “”;

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

randomStr = drawString(g, randomStr, i);

}

System.out.println(“随机字符:”+randomStr);

g.dispose();

session.removeAttribute(sessionKey);

session.setAttribute(sessionKey, randomStr);

String base64String = “”;

try {

// 直接返回图片

// ImageIO.write(image, “PNG”, response.getOutputStream());

//返回 base64

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, “PNG”, bos);

byte[] bytes = bos.toByteArray();

Base64.Encoder encoder = Base64.getEncoder();

base64String = encoder.encodeToString(bytes);

} catch (Exception e) {

e.printStackTrace();

}

return base64String;

}

}

接下来写接口,创建一个ValidateCodeController.java,

先是生成验证码,返回图片的接口:

import com.example.demo.util.ValidateCodeUtil;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

  • @Author : JCccc

  • @CreateTime : 2019/9/25

  • @Description :

**/

@RestController

public class ValidateCodeController {

//返回验证码图片

@GetMapping(“/getCaptchaImg”)

public void getCaptchaImg(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

try {

response.setContentType(“image/png”);

response.setHeader(“Cache-Control”, “no-cache”);

response.setHeader(“Expire”, “0”);

response.setHeader(“Pragma”, “no-cache”);

ValidateCodeUtil validateCode = new ValidateCodeUtil();

// getRandomCodeImage方法会直接将生成的验证码图片写入response

validateCode.getRandomCodeImage(request, response);

// System.out.println(“session里面存储的验证码为:”+session.getAttribute(“JCCODE”));

} catch (Exception e) {

e.printStackTrace();

}

}

}

用postman来调用下接口,

可以看到控制台的打印,这个验证码字符串已经存入了session(在后面的验证接口有介绍取值)

OK,接下来是编写一个校验验证码接口:

//验证码校验

@GetMapping(“/checkCaptcha”)

public boolean getCheckCaptcha(@RequestParam(“code”) String code, HttpSession session) {

try {

//toLowerCase() 不区分大小写进行验证码校验

String sessionCode= String.valueOf(session.getAttribute(“JCCODE”)).toLowerCase();

System.out.println(“session里的验证码:”+sessionCode);

String receivedCode=code.toLowerCase();

System.out.println(“用户的验证码:”+receivedCode);

return !sessionCode.equals(“”) && !receivedCode.equals(“”) && sessionCode.equals(receivedCode);

} catch (Exception e) {

return false;

}

}

用postman调下接口,先生成验证码模拟返回给页面了,

然后调用校验验证码接口,模拟用户在页面输入验证码,

可以看到校验正确。

最后,再补一个返回base64编码串的接口,

// 生成验证码,返回的是 base64

@GetMapping(“/getCaptchaBase64”)

public Object getCaptchaBase64(HttpServletRequest request, HttpServletResponse response) {

Map result = new HashMap();

try {

response.setContentType(“image/png”);

response.setHeader(“Cache-Control”, “no-cache”);

response.setHeader(“Expire”, “0”);

response.setHeader(“Pragma”, “no-cache”);

ValidateCodeUtil validateCode = new ValidateCodeUtil();

// 返回base64

String base64String = validateCode.getRandomCodeBase64(request, response);

result.put(“url”, “data:image/png;base64,” + base64String);

result.put(“message”, “created successfull”);

//http://tool.chinaz.com/tools/imgtobase/ base64直接转为图片网站

System.out.println(“结果:” + result.get(“url”));

} catch (Exception e) {

System.out.println(e);

}

return result;

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

[外链图片转存中…(img-OvXy6Gef-1713306207711)]

[外链图片转存中…(img-jYlPMjBR-1713306207711)]

[外链图片转存中…(img-uiI0Lq1m-1713306207711)]

[外链图片转存中…(img-ZxpfkH9Z-1713306207712)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值