当前位置:网站首页>校验码生成
校验码生成
2022-07-25 22:53:00 【kgduu】
1、后端
VerificationCode生成校验码图片的类,由4个[0-9a-zA-Z]组成
public class VerificationCode {
private static int width = 100;
private static int height = 30;
private static Color bgColor = new Color(255, 255, 255);
private static String codes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static String[] fontNames = {"宋体", "楷体", "隶书", "微软雅黑" };
private String text;
private Random random = new Random();
public static void ouptput(BufferedImage image, OutputStream out) throws IOException {
ImageIO.write(image, "JPEG", out);
}
public BufferedImage getImage() {
BufferedImage image = createImage();
Graphics2D g2 = (Graphics2D)image.getGraphics();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 4; i++) {
String s = randomChar() + "";
sb.append(s);
g2.setColor(randomColor());
g2.setFont(randomFont());
float x = i * width * 1.0f / 4;
g2.drawString(s, x, height - 8);
}
this.text = sb.toString();
drawLine(image);
return image;
}
public String getText() {
return text;
}
private BufferedImage createImage() {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)image.getGraphics();
g2.setColor(bgColor);
g2.fillRect(0, 0, width, height);
return image;
}
private char randomChar() {
return codes.charAt(random.nextInt(codes.length()));
}
private Color randomColor() {
int red = random.nextInt(150);
int green = random.nextInt(150);
int blue = random.nextInt(150);
return new Color(red, green, blue);
}
private Font randomFont() {
String name = fontNames[random.nextInt(fontNames.length)];
int style = random.nextInt(4);
int size = random.nextInt(5) + 24;
return new Font(name, style, size);
}
private void drawLine(BufferedImage image) {
Graphics2D g2 = (Graphics2D)image.getGraphics();
int num = 5;
for (int i = 0; i < num; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g2.setColor(randomColor());
g2.setStroke(new BasicStroke(1.5f));
g2.drawLine(x1, y1, x2, y2);
}
}
}
controller层代码
@RestController
public class LoginController {
@GetMapping("/verifyCode")
public void verifyCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
VerificationCode code = new VerificationCode();
BufferedImage image = code.getImage();
String text = code.getText();
HttpSession session = request.getSession(true);
session.setAttribute("verify_code", text);
VerificationCode.ouptput(image, response.getOutputStream());
}
}
2、前端
<template>
<div>
<el-form
ref="loginForm"
v-loading="loading"
element-loading-text="正在登录..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
:model="loginForm"
class="loginContainer"
>
<h3 class="loginTitle">系统登录</h3>
<el-form-item prop="username">
<el-input size="normal" type="text" v-model="loginForm.username" auto-complete="off"
placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input size="normal" type="password" v-model="loginForm.password" auto-complete="off"
placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item prop="code">
<el-input size="normal" type="text" v-model="loginForm.code" auto-complete="off"
placeholder="点击图片更换验证码" style="width: 250px"></el-input>
<img :src="vcUrl" alt="" style="cursor: pointer">
</el-form-item>
<el-checkbox size="normal" class="loginRemember" v-model="checked"></el-checkbox>
<el-button size="normal" type="primary" style="width: 100%;" >登录</el-button>
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
loading : false,
vcUrl : 'http://localhost:8080/verifyCode',
loginForm: {
username: 'admin',
password: '123'
},
checked: true
}
}
}
</script>
<style>
.loginContainer {
border-radius: 15px;
background-clip: padding-box;
margin: 180px auto;
width: 350px;
padding: 15px 35px 15px 35px;
background: #fff;
border: 1px solid #eaeaea;
box-shadow: 0 0 25px #cac6c6;
}
.loginRemember {
text-align: left;
margin: 0px 0px 15px 0px;
}
.loginTitle {
margin: 15px auto 20px auto;
text-align: center;
color: #505458;
}
.el-form-item__content{
display: flex;
align-items: center;
}
</style>边栏推荐
- [文献阅读] - HRL -[HRL with Universal Policies for Multi-Step Robotic Manipulation]
- 武汉理工大学第三届程序设计竞赛 B-拯救DAG王国(拓扑性质处理可达性统计问题)
- Why is Google's internal tools not suitable for you?
- PE格式: 分析IatHook并实现
- CMU AI PhD 第一年总结
- Network Security Learning (11) scanning and blasting
- Kibana~后台启动Kibana之后无法找到进程号
- 【集训DAY12】X equation 【高精度】【数学】
- [training Day12] x equation [high precision] [mathematics]
- QT的Tree View Model示例
猜你喜欢

CMU AI PhD 第一年总结

冯诺依曼体系结构
![[literature reading] - HRL -[hrl with universal policies for multi step robotic control]](/img/34/06d5ba3af4e6e775a335324c020161.png)
[literature reading] - HRL -[hrl with universal policies for multi step robotic control]

Binder principle

Hcie is finally in hand, and the road begins

Two methods of printing strings in reverse order in C language

The fourth experiment nat
![[文献阅读] - HRL -[HRL with Universal Policies for Multi-Step Robotic Manipulation]](/img/34/06d5ba3af4e6e775a335324c020161.png)
[文献阅读] - HRL -[HRL with Universal Policies for Multi-Step Robotic Manipulation]
![[MySQL rights] UDF rights (with Malaysia)](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)
[MySQL rights] UDF rights (with Malaysia)

Qtreewidget control of QT
随机推荐
【集训DAY13】Internet【并查集】
Tfrecord write and read
Domain oriented model programming
Can generic types be used in array
XSS tool beef XSS installation and use
技术美术百人计划学习笔记(1)--基础渲染管线
JSON object
ribbon 执行逻辑源码解析
[training Day12] be go! [dynamic programming] [mathematics]
[training day15] simple calculation [tree array] [mathematics]
[training day13] out race [mathematics] [dynamic planning]
[training Day12] tree! Tree! Tree! [greed] [minimum spanning tree]
软件测试 pytest pytest的命名规则 用例的前后置 conftest.py 定制allure报告 @pytest.mark.parametrize()装饰器作数据驱动
Vs2019 WinForm clr20r3 error
[training day15] paint road [minimum spanning tree]
[training Day11] Calc [mathematics]
面试题 17.11. 单词距离 ●●
Vodak software: Smart City solution
[tensorflow] about seed
Kibana~后台启动Kibana之后无法找到进程号