驗證碼工具-kaptcha
阿新 • • 發佈:2022-05-08
<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; @Autowiredprivate 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