当前位置:网站首页>动态验证码
动态验证码
2022-06-25 22:03:00 【-LM-】
动态验证码
前端代码
<div id="validatePanel" class="item" style="width: 137px;">
<input type="text" name="captcha" placeholder="请输入验证码" maxlength="4">
<img id="refreshCaptcha" class="validateImg" onclick="changeCode()" th:src="@{/code}">
</div>
<script> function changeCode() {
$('.validateImg').attr("src","/code?t="+Math.random()); } </script>
Controller层
@RequestMapping("/code")
@ResponseBody
public void code(HttpSession session, HttpServletRequest request, HttpServletResponse respon) throws IOException {
//参数分别为长、宽、验证码字母个数、干扰程度
ValidateCode validateCode = new ValidateCode(100,35,4,20);
String code = validateCode.getCode();
request.getSession().setAttribute("code",code);
System.out.println(code);
try {
ServletOutputStream outputStream = respon.getOutputStream();
// 往IO流写入生成的验证码图片
validateCode.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
ValidateCode源码解析
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package cn.dsna.util.images;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public class ValidateCode {
private int width = 160;
private int height = 40;
private int codeCount = 5;
private int lineCount = 150;
private String code = null;
private BufferedImage buffImg = null;
private char[] codeSequence = new char[]{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
public ValidateCode() {
this.createCode();
}
public ValidateCode(int width, int height) {
this.width = width;
this.height = height;
this.createCode();
}
public ValidateCode(int width, int height, int codeCount, int lineCount) {
this.width = width;
this.height = height;
this.codeCount = codeCount;
this.lineCount = lineCount;
this.createCode();
}
public void createCode() {
int x = false;
int fontHeight = false;
int codeY = false;
int red = false;
int green = false;
int blue = false;
int x = this.width / (this.codeCount + 2);
int fontHeight = this.height - 2;
int codeY = this.height - 4;
this.buffImg = new BufferedImage(this.width, this.height, 1);
Graphics2D g = this.buffImg.createGraphics();
Random random = new Random();
g.setColor(Color.WHITE);
g.fillRect(0, 0, this.width, this.height);
ImgFontByte imgFont = new ImgFontByte();
Font font = imgFont.getFont(fontHeight);
g.setFont(font);
int i;
int red;
int green;
int blue;
for(int i = 0; i < this.lineCount; ++i) {
i = random.nextInt(this.width);
int ys = random.nextInt(this.height);
int xe = i + random.nextInt(this.width / 8);
int ye = ys + random.nextInt(this.height / 8);
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
g.setColor(new Color(red, green, blue));
g.drawLine(i, ys, xe, ye);
}
StringBuffer randomCode = new StringBuffer();
for(i = 0; i < this.codeCount; ++i) {
String strRand = String.valueOf(this.codeSequence[random.nextInt(this.codeSequence.length)]);
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
g.setColor(new Color(red, green, blue));
g.drawString(strRand, (i + 1) * x, codeY);
randomCode.append(strRand);
}
this.code = randomCode.toString();
}
public void write(String path) throws IOException {
OutputStream sos = new FileOutputStream(path);
this.write((OutputStream)sos);
}
public void write(OutputStream sos) throws IOException {
ImageIO.write(this.buffImg, "png", sos);
sos.close();
}
public BufferedImage getBuffImg() {
return this.buffImg;
}
public String getCode() {
return this.code;
}
}
边栏推荐
- 解决TypeError: Unicode-objects must be encoded before hashing
- Kylin
- C2. k-LCM (hard version)-Codeforces Round #708 (Div. 2)
- character string
- golang Make a list of intervals with sequential numbers
- 社招两年半10个公司28轮面试面经(含字节、拼多多、美团、滴滴......)
- 28 rounds of interviews with 10 companies in two and a half years (including byte, pinduoduo, meituan, Didi...)
- C1. k-LCM (easy version)-Codeforces Round #708 (Div. 2)
- Mutual conversion between QT utf8 and Unicode encoding, and the Unicode encoding output format is &xxxxx
- 史上最简单的录屏转gif小工具LICEcap,要求不高可以试试
猜你喜欢

Anaconda一文入门笔记

Leetcode-1528- rearrange string - hash table - string

LeetCode-1528-重新排列字符串-哈希表-字符串

先序线索二叉树

Qtcreator formatting code

Hibernate architecture introduction and environment construction (very detailed)

Visual studio code create minimal web API (asp.net core)

18亿像素火星全景超高清NASA放出,非常震撼

28 rounds of interviews with 10 companies in two and a half years (including byte, pinduoduo, meituan, Didi...)

CXF
随机推荐
Uniapp - call payment function: Alipay
golang Make a list of intervals with sequential numbers
Go语言逃逸分析全纪录
解决TypeError: Unicode-objects must be encoded before hashing
Record the ideas and precautions for QT to output a small number of pictures to mp4
mongodb
Kotlin空指针Bug
jdbc常见异常及错误解决办法汇总
【AXI】解读AXI协议乱序机制
Leetcode (605) -- flower planting
QLabel 文字水平滚动显示
Qt 中文和英文分别使用不同的字体
CXF
Analysis and comprehensive summary of full type equivalent judgment in go
Reproduction of an implant found by Kaspersky that writes shellcode into evenlog
mysql集群
Style setting when there is a separator in the qcombobox drop-down menu
Xinchida nd04 nd04c nrf52832 (52810) ble module (low power Bluetooth communication module) at command test
对卡巴斯基发现的一个将shellcode写入evenlog的植入物的复现
经典图像分割网络:Unet 支持libtorch部署推理【附代码】