java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java实现图形验证码

java使用Hutool工具库实现图形验证码

作者:新绿MEHO

本文介绍了java使用Hutool工具库实现图形验证码的方法,线段干扰验证码、圆圈干扰验证码和扰乱干扰验证码,通过Hutool简化了验证码的生成与验证过程,提升了开发效率,文章详细描述了线段干扰验证码的登录验证步骤,并提供了前端和后端代码示例

下面将使用Hutool工具库来辅助完成验证码的实现。

关于Hutool的介绍

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

引入依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.26</version>
</dependency>

图形验证码

介绍

验证码功能位于cn.hutool.captcha包中,核心接口为ICaptcha,此接口定义了以下方法:

createCode 创建验证码,实现类需同时生成随机验证码字符串和验证码图片
getCode 获取验证码的文字内容
verify 验证验证码是否正确,建议忽略大小写
write 将验证码图片写出到目标流中

其中write方法只有一个OutputStream,ICaptcha实现类可以根据这个方法封装写出到文件等方法。

AbstractCaptcha为一个ICaptcha抽象实现类,此类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法,通过继承此抽象类只需实现createImage方法定义图形生成规则即可。

LineCaptcha实现线段干扰的验证码

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;

public class DemoController {
    public static void main(String[] args) {
        //定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);


        //图形验证码写出,可以写出到文件,也可以写出到流
        lineCaptcha.write("d:/line.png");
        //输出code
        Console.log(lineCaptcha.getCode());
        //验证图形验证码的有效性,返回boolean值
        lineCaptcha.verify("1234");

        //重新生成验证码
        lineCaptcha.createCode();
        lineCaptcha.write("d:/line.png");
        //新的验证码
        Console.log(lineCaptcha.getCode());
        //验证图形验证码的有效性,返回boolean值
        lineCaptcha.verify("1234");
    }
}

运行结果:

得到的图形验证码:

CircleCaptcha实现圆圈干扰验证码

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.core.lang.Console;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CircleController {
    public static void main(String[] args) {
        //定义图形验证码的长、宽、验证码字符数、干扰元素个数
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
        //CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);
        //图形验证码写出,可以写出到文件,也可以写出到流
        captcha.write("d:/circle.png");
        Console.log(captcha.getCode());
        //验证图形验证码的有效性,返回boolean值
        captcha.verify("1234");
    }
}

运行结果:

得到的图形验证码:

ShearCaptcha实现扰乱干扰验证码

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import cn.hutool.core.lang.Console;

public class ShearController {
    public static void main(String[] args) {
        //定义图形验证码的长、宽、验证码字符数、干扰线宽度
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
        //ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4);
        //图形验证码写出,可以写出到文件,也可以写出到流
        captcha.write("d:/shear.png");
        Console.log(captcha.getCode());
        //验证图形验证码的有效性,返回boolean值
        captcha.verify("1234");
    }
}

运行结果:

得到的图形验证码:

线段干扰验证码实现登录验证

线段干扰验证码实现登录验证步骤详解:

1.图形验证码登录分为前端和后端;

2.前端首先会向后端发起请求获取图形验证码;

3.后端接收到前端发送的获取图形验证码请求后,生成图形验证码并响应给前端;

4.于此同时,后端将刚刚生成的图形验证码的值存放到session里面,包括当时的时间;

5.然后用户在前端页面输入验证码并提交,前端将用户输入的验证码发送给后端;

6.后端接受到前端发送的验证码,首先判断验证码是否为空;

7.后端然后获取当前请求对应存储的session,从中提取图形验证码的值和时间;

8.后端比对前端的验证码和session中存储的验证码,并判断当前时间和session中存储的时间差;

9.如果前端的验证码和session中存储的验证码相同,并且当前时间和session中存储的时间差小于设定的值,那么就返回true,否则返回false;

10.前端接收到后端的响应,判断响应返回的值是否为true,如果为true,则跳转到验证成功的页面。

后端代码 

application.yml

captcha:
  width: 200
  height: 100
  session:
    key: captcha_session_key
    date: captcha_session_date

CaptchaProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "captcha")
@Data
public class CaptchaProperties {
    private Integer width;
    private Integer height;
    private Session session;

    @Data
    public static class Session{
        private String key;
        private String date;
    }

}

CaptchaController

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;
import com.wmh.captcha.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;

@RequestMapping("/captcha")
@RestController
public class DCaptchaController {
    private final static long session_valid_timeout = 60 * 1000;

    @Autowired
    private CaptchaProperties captchaProperties;



    @RequestMapping("/get")
    public void getCaptcha(HttpSession session, HttpServletResponse response){
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
        //设置返回类型
        response.setContentType("image/jpeg");
        //禁止缓存
        response.setHeader("Progma", "No-cache");
        Console.log(lineCaptcha.getCode());
        //图形验证码写出,可以写出到文件,也可以写出到流
        try {
            lineCaptcha.write(response.getOutputStream());
            //存储session
            session.setAttribute(captchaProperties.getSession().getKey(),lineCaptcha.getCode());
            session.setAttribute(captchaProperties.getSession().getDate(), new Date());
            response.getOutputStream().close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @RequestMapping("/check")
    public Boolean check(String inputCode, HttpSession session){

        //验证码生成的内容, 和用户输入的进行比较
        if (!StringUtils.hasLength(inputCode)){
            return false;
        }
        //从session获取信息
        String savedCode = (String) session.getAttribute(captchaProperties.getSession().getKey());
        Date saveDate = (Date) session.getAttribute(captchaProperties.getSession().getDate());
        if (inputCode.equalsIgnoreCase(savedCode)){
            //判断验证码是否过期
            if (saveDate!=null && System.currentTimeMillis()-saveDate.getTime() < session_valid_timeout){
                return true;
            }
        }

        return false;
    }

}

前端代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>验证码</title>
    <style>
        #inputCaptcha {
            height: 30px;
            vertical-align: middle;
        }
        #verificationCodeImg{
            vertical-align: middle;
        }
        #checkCaptcha{
            height: 40px;
            width: 100px;
        }
    </style>
</head>
<body>
<h1>输入验证码</h1>
<div id="confirm">
    <input type="text" name="inputCaptcha" id="inputCaptcha">
    <img id="verificationCodeImg" src="/captcha/get" style="cursor: pointer;" title="看不清?换一张" />
    <input type="button" value="提交" id="checkCaptcha">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
    $("#verificationCodeImg").click(function(){
        $(this).hide().attr('src', '/captcha/get?dt=' + new Date().getTime()).fadeIn();
    });
    $("#checkCaptcha").click(function () {
        console.log('按钮被点击了');  // 调试信息
        $.ajax({
            url: "/captcha/check",
            type: "post",
            data: {
                inputCode: $("#inputCaptcha").val()
            },
            success: function(result){
                console.log(result);
                if(result){
                    location.href = "success.html";
                } else {
                    alert("验证码错误或者过期");
                }
            },
            error: function(xhr, status, error) {
                console.error('请求失败:', status, error);  // 调试信息
            }
        });
    });
</script>
</body>
</html>

 success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>验证成功页</title>
</head>
<body>
<h1>验证成功</h1>
</body>
</html>

运行结果

到此这篇关于java使用Hutool工具库实现图形验证码的文章就介绍到这了,更多相关java实现图形验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文