当前位置:网站首页>Dynamic verification code
Dynamic verification code
2022-06-26 00:42:00 【-LM-】
Dynamic verification code
The front-end code
<div id="validatePanel" class="item" style="width: 137px;">
<input type="text" name="captcha" placeholder=" Please enter the verification code " 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 layer
@RequestMapping("/code")
@ResponseBody
public void code(HttpSession session, HttpServletRequest request, HttpServletResponse respon) throws IOException {
// The parameters are respectively long 、 wide 、 Number of letters of verification code 、 Degree of interference
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();
// Go to IO Stream write generated verification code image
validateCode.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
ValidateCode The source code parsing
//
// 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;
}
}
边栏推荐
- SMT Mounter workflow
- "Seamless" deployment of paddlenlp model based on openvinotm development kit
- 19c安装psu 19.12
- 小红书微服务框架及治理等云原生业务架构演进案例
- The problem of low video memory in yolov5 accelerated multi GPU training
- Logstash discards log data that does not match the file name exactly
- Law and self-regulation in the meta universe
- 1-9Vmware中网络配置
- SSL unresponsive in postman test
- 1-10vmware builds customized network architecture
猜你喜欢

Comprehensive introduction to Simulink solver

anchor free dection简介

Performance leads the cloud native database market! Intel and Tencent jointly build cloud technology ecology

【TSP问题】基于Hopfield神经网络求解旅行商问题附Matlab代码

leetcode.14 --- 最长公共前缀

删库跑路、“投毒”、改协议,开源有哪几大红线千万不能踩?

JS to input the start time and end time, output the number of seasons, and print the corresponding month and year

How to design the product roadmap?

Core ideas of SQL optimization

AD20(Altium Designer) PCB 高亮网络
随机推荐
信号处理函数内必须使用可重入函数
使用VS2022编译Telegram桌面端(tdesktop)
Explanation of chip processing manufacturer__ What is ICT? What is the main test? Advantages and disadvantages of ICT testing?
What are AOI, X-ray and ICT in SMT industry? What does it do?
oracle RAC 集群无法启动
mtb13_Perform extract_blend_Super{Candidate(PrimaryAlternate)_Unique(可NULL过滤_Foreign_index_granulari
Run the test program using rknn-toolkit-lite2 for rk3568 development board
元宇宙中的法律与自我监管
Methods to realize asynchrony
快手实时数仓保障体系研发实践
How to bypass SSL authentication
原型和原型链的理解
Servlet response download file
Regular expression introduction and some syntax
leetcode.14 --- 最长公共前缀
Redisson 3.17.4 release
JS to input the start time and end time, output the number of seasons, and print the corresponding month and year
Introduction to anchor free decision
Display unassigned virtual address after easyconnect connection
Darkent2ncnn error