验证码

11/4/2022 hutool
(adsbygoogle = window.adsbygoogle || []).push({});

# 验证码

# kaptcha——谷歌验证码工具(样式太老了)

# 导入依赖

<dependency>
    <groupId>com.google.code</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>
1
2
3
4
5

直接下载失败

方法一:

官网下载后放入maven本地仓库相应的目录里面

Google Code Archive - Long-term storage for Google Code Project Hosting. (opens new window)

方法2:

换github

<dependency>
		<groupId>com.github.penggle</groupId>
		<artifactId>kaptcha</artifactId>
		<version>2.3.2</version>
</dependency>
1
2
3
4
5

# easycaptcha

https://github.com/pig-mesh/easy-captcha (opens new window)

# 使用hutool工具包

controller层,将验证码以base64编码返回前端,并将真实的值存到redis中,key值是"captcha_code_"+uuid,key值也返回前端,有效期设为为15s。

 @GetMapping("/captcha")
    public AjaxResult captcha(){
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200,100,4,20);
        String uuid = UUID.randomUUID().toString();
        //保存到redis
        redisUtil.setEx("captcha_code_" + uuid, captcha.getCode(), 15L, TimeUnit.SECONDS);
        Map<String, String> map = new HashMap<>();
        map.put("uuid",uuid);
        map.put("captcha",captcha.getImageBase64());
        return AjaxResult.success(200,"获取验证码成功",map);
    }
1
2
3
4
5
6
7
8
9
10
11

登录时判断验证码,如果有问题抛出异常到全局异常处理器

 @RequestMapping("/login")
    public AjaxResult login(User user){
        String code = redisUtil.get("captcha_code_" + user.getUuid());
        if(code == null) throw new RuntimeException("验证码超时");
        if(!code.equals(user.getCode().toLowerCase())) throw new RuntimeException("验证码错误");
        String uuid = UUID.randomUUID().toString();
        redisUtil.setEx(uuid, JSON.toJSONString(user), 15L, TimeUnit.MINUTES);
        System.out.println(user);
        Map<String, String> payload = new HashMap<>();
        //加密算法,非对称加密
        payload.put("userId", user.getUserId());
        payload.put("userName", user.getUserName());
        payload.put("login_key",  uuid);
        return AjaxResult.success(200,"登录成功",jwtutil.getTokenRsa(payload, Calendar.HOUR, 1));
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

前端,存储一个隐藏的input,值为存储验证码的key值,登录时一起发送到后端

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页</title>
    <script src="https://upcdn.b0.upaiyun.com/libs/jquery/jquery-2.0.2.min.js"></script>
    <script>
        $(function(){
            getCaptcha()
        })
        function getCaptcha(){
            $.ajax({
                url: "http://127.0.0.1:8080/user/captcha",
                method: 'get',
                dataType: "json",
                success: function (result) {
                    if(result.success){
                        $("#captcha").attr("src","data:image/png;base64," + result.object.captcha);
                        $("#uuid").val(result.object.uuid)
                    }
                   
                }
            });
        }
        function login() {
            $.ajax({
                url: "http://127.0.0.1:8080/user/login",
                method: 'post',
                data: $("#loginForm").serialize(),
                dataType: "json",
                success: function (result) {
                    if(result.success){
                        localStorage.setItem("token", result.object)
                        location.href="/main.html"
                    }else{
                        console.log('账号或密码错误')
                    }
                   
                }
            });
        }

    </script>
</head>

<body>
    <form id="loginForm">
        账户:<input type="text" name="userId" id="userId"><br/>
        密码:<input type="password" name="password" id="password"><br/>
        <input  name="uuid" id="uuid" hidden><br/>
        验证码:<input type="text" name="code" ><br/>
        <img  id="captcha" src="" onclick="getCaptcha()">
    </form>
    <input type="button" onclick="login()" value="登录">
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60