Spring验证码

 前言:使用Hutool

1.什么是Hutool?

2.代码复制到test类中

 

3.代码爆红,说明需要引入依赖

4.根据名取Maven仓库相关依赖

 

  

5.在pom.xml文件中进行配置 

6.引入成功

 

7. 运行程序

打开d盘,发现已经生成了验证码的图片,路径在上面提示有。 

  

使用其他验证码的方式相同,不赘述。

 


1.验证码项目

功能:后端实现验证码实现逻辑,前端负责返回的数据进行页面的提示。

实现:用户进行验证码输入,输入正确则跳转验证成功的页面,没输入或者输入不对,有弹窗提示,有60s的验证时间。

 

 

2.写生成验证码后端接口

 

1.先简单编写后端接口captcha(类CaptchaController)

2.验证是否成功 

 3.配置文件 

为什么要配置文件?

好进行封装,因为图片长宽高,session,date等都是可以设置的常量

session的key是拿到用户输入的验证码进行比较 

date指的是验证码的是时效。

这些都是可以设置为常量,你也可以在一个类中设置这些常量,但是如果有多个类要进行使用呢?

当然前期学习时我们是创建一个对象进行存储常量,但是我们这里是进行配置的学习啦。

这里把默认的application.properties修改成yml。

之所以修改单纯是为了练习。 

4. 创建一个CaptchaProperties对象

代码:

package com.example.demo.model;

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;
    }

}

为什么要创建一个对象?

比如拿现在有个常量要接受,你是要定义五个变量接收呢,还是使用一个对象接收?

 

代码: 

package com.example.demo.controller;  
  
import cn.hutool.captcha.CaptchaUtil;  
import cn.hutool.captcha.LineCaptcha;  
import com.example.demo.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.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.io.IOException;  
import java.util.Date;  
  
/**  
 * 验证码控制器,用于处理验证码的生成和验证  
 */  
@RequestMapping("/captcha")  
@RestController  
public class CaptchaController {  
    // 设置验证码在Session中的有效时间(毫秒)  
    private final static long SESSION_VALID_TIMEOUT = 60 * 1000;  
  
    // 注入CaptchaProperties配置类,用于获取验证码的配置信息  
    @Autowired  
    private CaptchaProperties captchaProperties;  
  
    /**  
     * 获取验证码图片  
     *   
     * @param session 用于存储验证码及其生成时间的HttpSession  
     * @param response 用于输出验证码图片的HttpServletResponse  
     */  
    @RequestMapping("/get")  
    public void getCaptcha(HttpSession session, HttpServletResponse response) {  
        // 根据CaptchaProperties中的配置生成一个线性验证码  
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());  
  
        // 设置响应的内容类型为图片  
        response.setContentType("image/jpg");  
  
        // 禁止浏览器缓存验证码图片  
        response.setHeader("Pragma", "No-cache");  
  
        // 将验证码图片写入到响应的输出流中  
        try {  
            lineCaptcha.write(response.getOutputStream());  
  
            // 将验证码文本存储在Session中,用于后续的验证  
            session.setAttribute(captchaProperties.getSession().getKey(), lineCaptcha.getCode());  
  
            // 可选:将验证码的生成时间也存储在Session中,以便进行过期检查  
            session.setAttribute(captchaProperties.getSession().getDate(), new Date());  
  
            // 关闭响应的输出流  
            response.getOutputStream().close();  
        } catch (IOException e) {  
            // 如果发生IO异常,则抛出运行时异常  
            throw new RuntimeException(e);  
        }  
    }  
}

3.写校验验证码check接口

代码:

   @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;
    }

}

 4.写前端代码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 () {
        $.ajax({
          url: "/captcha/check",
          type: "post",
          data: {
            inputCode: $("#inputCaptcha").val()
          },
          success:function(result){
            if(result){
              location.href = "success.html";
            }else{
              alert("验证码错误或者过期");
            }
          }
        });
    });

  </script>
</body>

</html>

5.写前端代码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>

 

  6.展示:


 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值