图片验证码的实现方法

前言

图片验证码是我们日常经常用到的,本文将介绍如何实现以及其原理,并没有过多注重css样式(有些简陋)。如果对滑块验证码感兴趣的可以看这篇文章:滑块验证码实现及原理
在这里插入图片描述

实现

主要是利用canvas画布加上随机字母,以及适当的旋转,移动,颜色。这一块主要利用的是css3的内容。

对于代码看不懂的可以看注释,注释标注的很详细。

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>图片验证码</title>
</head>

<body>
    <canvas id="canvas" width="120" height="40"></canvas>
    <input type="text" id="text">
    <input type="button" value="提交" id="bt">
    <script>
        var canvas = document.getElementById("canvas");//演员
        var context = canvas.getContext("2d");//舞台,getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
        var button = document.getElementById("bt");//获取按钮
        var input = document.getElementById("text");//获取输入框
        draw();
        canvas.onclick = function () {
            context.clearRect(0, 0, 120, 40);//在给定的矩形内清除指定的像素
            draw();
        }
        // 随机颜色函数
        function getColor() {
            var r = Math.floor(Math.random() * 256);
            var g = Math.floor(Math.random() * 256);
            var b = Math.floor(Math.random() * 256);
            return "rgb(" + r + "," + g + "," + b + ")";
        }
        function draw() {
            context.strokeRect(0, 0, 120, 40);//绘制矩形(无填充)
            var aCode = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
            // 绘制字母
            var arr = [] //定义一个数组用来接收产生的随机数
            var num //定义容器接收验证码
            for (var i = 0; i < 4; i++) {
                var x = 20 + i * 20;//每个字母之间间隔20
                var y = 20 + 10 * Math.random();//y轴方向位置为20-30随机
                var index = Math.floor(Math.random() * aCode.length);//随机索引值
                var txt = aCode[index];
                context.font = "bold 20px 微软雅黑";//设置或返回文本内容的当前字体属性
                context.fillStyle=getColor();//设置或返回用于填充绘画的颜色、渐变或模式,随机
                context.translate(x,y);//重新映射画布上的 (0,0) 位置,字母不可以旋转移动,所以移动容器
                var deg=90*Math.random()*Math.PI/180;//0-90度随机旋转
                context.rotate(deg);// 	旋转当前绘图
                context.fillText(txt, 0, 0);//在画布上绘制“被填充的”文本
                context.rotate(-deg);//将画布旋转回初始状态
                context.translate(-x,-y);//将画布移动回初始状态
                arr[i] = txt //接收产生的随机数
            }
            num = arr[0] + arr[1] + arr[2] + arr[3] //将产生的验证码放入num
            // 绘制干扰线条
            for (var i = 0; i < 8; i++) {
                context.beginPath();//起始一条路径,或重置当前路径
                context.moveTo(Math.random() * 120, Math.random() * 40);//把路径移动到画布中的随机点,不创建线条
                context.lineTo(Math.random() * 120, Math.random() * 40);//添加一个新点,然后在画布中创建从该点到最后指定点的线条
                context.strokeStyle=getColor();//随机线条颜色
                context.stroke();// 	绘制已定义的路径
            }
            // 绘制干扰点,和上述步骤一样,此处用长度为1的线代替点
            for (var i = 0; i < 20; i++) {
                context.beginPath();
                var x = Math.random() * 120;
                var y = Math.random() * 40;
                context.moveTo(x, y);
                context.lineTo(x + 1, y + 1);
                context.strokeStyle=getColor();
                context.stroke();
            }

            //点击按钮验证
            button.onclick = function () { 
            var text = input.value //获取输入框的值
            if (text === num) {
                alert('验证通过')
            } else {
                alert('验证失败')
            }
         }
            
        }

    </script>
</body>

</html>

效果图

在这里插入图片描述

  • 12
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Spring Boot 中实现图片验证码可以通过以下步骤进行: 1. 添加依赖:在 `pom.xml` 文件中添加以下依赖项: ```xml <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</version> </dependency> ``` 2. 创建验证码生成器:创建一个验证码生成器类,用于生成验证图片。可以参考以下示例代码: ```java import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; @Configuration public class CaptchaConfig { @Bean public DefaultKaptcha defaultKaptcha() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", "no"); properties.setProperty("kaptcha.textproducer.font.color", "black"); properties.setProperty("kaptcha.image.width", "150"); properties.setProperty("kaptcha.image.height", "50"); properties.setProperty("kaptcha.textproducer.char.length", "4"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } ``` 3. 创建验证码接口:创建一个接口或控制器,用于处理验证码相关的请求,并将生成的验证图片返回给前端。示例代码如下: ```java import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; @RestController public class CaptchaController { private final DefaultKaptcha captchaGenerator; @Autowired public CaptchaController(DefaultKaptcha captchaGenerator) { this.captchaGenerator = captchaGenerator; } @GetMapping("/captcha") public void getCaptcha(HttpServletResponse response) throws IOException { // 生成验证码 String captchaText = captchaGenerator.createText(); BufferedImage captchaImage = captchaGenerator.createImage(captchaText); // 将验证码文本存储在 session 中(可根据具体需求存储在其他地方) // request.getSession().setAttribute("captcha", captchaText); // 将验证图片输出给前端 response.setContentType("image/jpeg"); try (OutputStream outputStream = response.getOutputStream()) { ImageIO.write(captchaImage, "jpeg", outputStream); outputStream.flush(); } } } ``` 4. 前端页面:在前端页面中使用 `<img>` 标签来显示验证图片,并添加一个刷新按钮。示例代码如下: ```html <!DOCTYPE html> <html> <head> <title>Captcha Demo</title> </head> <body> <h1>Captcha Demo</h1> <img id="captchaImage" src="" alt="Captcha"> <button onclick="refreshCaptcha()">Refresh</button> <script> function refreshCaptcha() { var captchaImage = document.getElementById("captchaImage"); captchaImage.src = "/captcha?t=" + new Date().getTime(); } // 页面加载时刷新验证码 window.onload = function() { refreshCaptcha(); }; </script> </body> </html> ``` 这样就可以在 Spring Boot 中实现图片验证码了。用户可以通过访问 `/captcha` 路径获取验证图片,并在前端页面中显示。每次刷新验证码时,可以调用 `refreshCaptcha()` 函数来更新验证图片。请根据自己的需求进行相应的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值