1. 程式人生 > 其它 >驗證碼工具-kaptcha

驗證碼工具-kaptcha

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>kaptcha-spring-boot-starter</artifactId>
  <version>1.0.0</version>
</dependency>
package com.msb.controller;

import com.baomidou.kaptcha.Kaptcha;
import com.msb.annotations.TokenCheck;
import com.msb.overwriterGoogleKaptch.MyGoogleKaptcha;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.
*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author lcc * @version V1.0 * @Package com.msb.controller * @date 2022/5/8 11:18 */ @RestController @RequestMapping("/Kcaptcha") public class KcaptchaController { @Autowired private Kaptcha kaptcha; @Autowired
private MyGoogleKaptcha myGoogleKaptcha; @GetMapping("/generator") @TokenCheck(required = false) public void generatorCode(HttpServletRequest request, HttpServletResponse response){ kaptcha.render(); } @GetMapping("/validTime") public String validWithTime(String verifyCode,HttpServletRequest request) { boolean aBoolean
= kaptcha.validate(verifyCode, 10); System.out.println(verifyCode); if(aBoolean){ return "通過"; } return "不通過"; } @GetMapping("/verify") @TokenCheck(required = false) public String verify(String verifyCode,HttpServletRequest request){ System.out.println(verifyCode); Boolean aBoolean= kaptcha.validate(verifyCode); if(aBoolean){ return "通過"; } return "不通過"; } /*自定義 設定儲存在redis 裡面 */ @GetMapping("/generator-My") @TokenCheck(required = false) public void generatorMyCode(HttpServletRequest request){ myGoogleKaptcha.render(); } @GetMapping("/verify-My") @TokenCheck(required = false) public String verifyMycode(String verifyCode){ Boolean aBoolean= myGoogleKaptcha.validate(verifyCode); if(aBoolean){ return "通過"; } return "不通過"; } }
package com.msb.overwriterGoogleKaptch;

/**
 * @author lcc
 * @version V1.0
 * @Package com.msb.overwriterGoogleKaptch
 * @date 2022/5/8 14:40
 */

import com.baomidou.kaptcha.Kaptcha;
import com.baomidou.kaptcha.exception.KaptchaIncorrectException;
import com.baomidou.kaptcha.exception.KaptchaNotFoundException;
import com.baomidou.kaptcha.exception.KaptchaRenderException;
import com.baomidou.kaptcha.exception.KaptchaTimeoutException;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import java.io.IOException;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import lombok.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyGoogleKaptcha implements Kaptcha {
    private static final Logger log = LoggerFactory.getLogger(com.baomidou.kaptcha.GoogleKaptcha.class);
    private DefaultKaptcha kaptcha;
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    
    public MyGoogleKaptcha(DefaultKaptcha kaptcha) {
        this.kaptcha = kaptcha;
    }
    
    public String render() {
        this.response.setDateHeader("Expires", 0L);
        this.response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        this.response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        this.response.setHeader("Pragma", "no-cache");
        this.response.setContentType("image/jpeg");
        String sessionCode = this.kaptcha.createText();
        System.out.println(sessionCode);
        //String uuid = UUID.randomUUID().toString();
        String id = request.getSession().getId();
        try {
            ServletOutputStream out = this.response.getOutputStream();
            stringRedisTemplate.opsForValue().set(id, sessionCode);
            Throwable var3 = null;
    
            ImageIO.write(kaptcha.createImage(sessionCode), "jpg", out);
            return sessionCode;
        } catch (IOException e) {
            throw new KaptchaRenderException(e);
        }
    }
            
            

    
    public boolean validate(String code) {
        return this.validate(code, 900L);
    }
    
    public boolean validate( String code, long second) {
       
           // HttpSession httpSession = this.request.getSession(false);
        String id = request.getSession().getId();
        String s = stringRedisTemplate.opsForValue().get(id);
        
        if(code.equals(s)){
            stringRedisTemplate.delete(id);
            return true;
        }else {
    
        return false;
        }
        
       
    }
       
}
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.1.136:3306/dongbao?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  profiles:
    active: dev
  redis:
    # redis資料庫索引(預設為0),我們使用索引為3的資料庫,避免和其他資料庫衝突
    database: 3
    # redis伺服器地址(預設為loaclhost)
    host: localhost
    # redis埠(預設為6379)
    port: 6379
    # redis訪問密碼(預設為空)

    # redis連線超時時間(單位毫秒)
    timeout: 0
    # redis連線池配置
    pool:
      # 最大可用連線數(預設為8,負數表示無限)
      max-active: 8
      # 最大空閒連線數(預設為8,負數表示無限)
      max-idle: 8
      # 最小空閒連線數(預設為0,該值只有為正數才有用)
      min-idle: 0
      # 從連線池中獲取連線最大等待時間(預設為-1,單位為毫秒,負數表示無限)
      max-wait: -1
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0
  mapper-locations:
    - classpath*:/com/msb/mapper/xml/*.xml

server:
  port: 8001

kaptcha:
  height: 50
  width: 200
  content:
    length: 4
    source: abcdefghjklmnopqrstuvwxyz23456789
    space: 2
  font:
    color: black
    name: Arial
    size: 40
  background-color:
    from: red
    to: white
  border:
    enabled: true
    color: black
    thickness: 1