自定义生成验证码类:
package com.file.utlis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@RestController
public class SecurityCodeUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private char[] data = "ZXCVBNMASDFGHJKLPOIUYTREWQabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
private String code = "";
public static final int WIDTH = 120;
public static final int HEIGHT = 30;
@GetMapping("/verifCode")
public void getCode(HttpServletResponse response, HttpServletRequest request) throws IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
setBackGround(graphics);
setBorder(graphics);
drawRandomLine(graphics);
String random = drawRandomNum((Graphics2D) graphics);
redisTemplate.opsForValue().set("verifCode", random);
response.setContentType("image/jpeg");
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
ImageIO.write(image, "jpg", response.getOutputStream());
}
private void setBackGround(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
private void setBorder(Graphics g) {
g.setColor(Color.BLUE);
g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
}
private void drawRandomLine(Graphics g) {
g.setColor(Color.GREEN);
for (int i = 0; i < 5; i++) {
int x1 = new Random().nextInt(WIDTH);
int y1 = new Random().nextInt(HEIGHT);
int x2 = new Random().nextInt(WIDTH);
int y2 = new Random().nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}
private String drawRandomNum(Graphics2D g) {
StringBuffer sb = new StringBuffer();
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD, 24));
int x = 5;
for (int i = 0; i < 4; i++) {
int degree = new Random().nextInt() % 30;
String ch = data[new Random().nextInt(data.length)] + "";
sb.append(ch);
g.rotate(degree * Math.PI / 180, x, 20);
g.drawString(ch, x, 20);
g.rotate(-degree * Math.PI / 180, x, 20);
x += 30;
}
return sb.toString();
}
@PostMapping("/checkCode")
public boolean checkCode(HttpServletRequest request) {
String code = request.getParameter("code");
return true;
}
}
登陆页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>后台管理-登陆</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="lib/layui-v2.5.5/css/layui.css" media="all">
<style>
html, body {
width: 100%;
height: 100%;
overflow: hidden
}
body {
background: #1E9FFF;
}
body:after {
content: '';
background-repeat: no-repeat;
background-size: cover;
-webkit-filter: blur(3px);
-moz-filter: blur(3px);
-o-filter: blur(3px);
-ms-filter: blur(3px);
filter: blur(3px);
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
}
.layui-container {
width: 100%;
height: 100%;
overflow: hidden
}
.admin-login-background {
width: 360px;
height: 300px;
position: absolute;
left: 50%;
top: 40%;
margin-left: -180px;
margin-top: -100px;
}
.logo-title {
text-align: center;
letter-spacing: 2px;
padding: 14px 0;
}
.logo-title h1 {
color: #1E9FFF;
font-size: 25px;
font-weight: bold;
}
.login-form {
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
padding: 14px 20px;
box-shadow: 0 0 8px #eeeeee;
}
.login-form .layui-form-item {
position: relative;
}
.login-form .layui-form-item label {
position: absolute;
left: 1px;
top: 1px;
width: 38px;
line-height: 36px;
text-align: center;
color: #d2d2d2;
}
.login-form .layui-form-item input {
padding-left: 36px;
}
.captcha {
width: 60%;
display: inline-block;
}
.captcha-img {
display: inline-block;
width: 34%;
float: right;
}
.captcha-img img {
height: 34px;
border: 1px solid #e6e6e6;
height: 36px;
width: 100%;
}
</style>
</head>
<body>
<div class="layui-container">
<div class="admin-login-background">
<div class="layui-form login-form">
<form class="layui-form" action="">
<div class="layui-form-item logo-title">
<h1>LayuiMini后台登录</h1>
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-username" for="username"></label>
<input type="text" name="username" lay-verify="required|account" placeholder="用户名或者邮箱"
autocomplete="off" class="layui-input" value="root">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-password" for="password"></label>
<input type="password" name="password" lay-verify="required|password" placeholder="密码"
autocomplete="off" class="layui-input" value="root">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-vercode" for="captcha"></label>
<input type="text" name="captcha" id="codeInput" lay-verify="required|captcha" placeholder="图形验证码"
autocomplete="off" class="layui-input verification captcha" value="xszg">
<span id="tip"></span>
<div class="captcha-img">
<img id="captchaPic" src="http://localhost:8080/verifCode" alt="验证码获取时 端口号错误" >
</div>
</div>
<div class="layui-form-item">
<input type="checkbox" name="rememberMe" value="true" lay-skin="primary" title="记住密码">
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn layui-btn layui-btn-normal layui-btn-fluid" lay-submit="login"
lay-filter="login">登 入
</button>
<br>
<br>
<button type="reset" class="layui-btn layui-btn layui-btn-normal layui-btn-fluid">重置</button>
</div>
</form>
</div>
</div>
</div>
<script src="lib/jquery-3.4.1/jquery-3.4.1.min.js" charset="utf-8"></script>
<script src="js/glubo.js" charset="utf-8"></script>
<script src="lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
<script src="lib/jq-module/jquery.particleground.min.js" charset="utf-8"></script>
<script>
layui.use(['table', 'form', 'jquery', 'layer'], function () {
var table = layui.table,
form = layui.form,
$ = layui.jquery,
layer = layui.layer;
if (top.location != self.location) top.location = self.location;
$(document).ready(function () {
$('.layui-container').particleground({
dotColor: '#7ec7fd',
lineColor: '#7ec7fd'
});
});
form.on('submit(login)', function (data) {
data = data.field;
if (data.username == '') {
layer.msg('用户名不能为空');
return false;
}
if (data.password == '') {
layer.msg('密码不能为空');
return false;
}
if (data.captcha == '') {
layer.msg('验证码不能为空');
return false;
}
$.post(httpurl + "/login", {
'username': data.username,
'password': data.password
}, function (res) {
if (res) {
layer.msg('登录成功', {icon: 6}, function () {
window.location = 'index.html';
});
} else {
layer.msg('登录失败', {icon: 5}, function () {
window.location = 'login.html';
});
}
});
return false;
});
$("#captchaPic").click(function (res) {
var url = httpurl + "/verifCode";
var imgSrc = $("#captchaPic");
url = $("#captchaPic").attr("src");
imgSrc.attr("src", function () {
var timestamp = (new Date()).valueOf();
url = url + "?timestamp=" + timestamp;
return url;
});
});
$("#codeInput").blur(function (res) {
var code = $("#codeInput").val();
$.post(httpurl+"/checkCode",{'code': code},function (res) {
if(res){
layer.msg('验证码正确', {icon: 6});
}else {
layer.msg('验证码失败', {icon: 5});
}
});
});
});
</script>
</body>
</html>
效果图: