kcaptcha验证码和异常处理

293 阅读1分钟

kcaptcha验证码

引入依赖

   <!--kcaptcha-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>kaptcha-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>

代码展示

@RestController
@RequestMapping("/kcaptcha")
public class KcaptchaController {

    @Autowired
    private Kaptcha kaptcha;
    
    @GetMapping("/generator")
    @TokenCheck(required = false)
    public void generatorCode(HttpServletRequest request, HttpServletResponse response) {
        kaptcha.render();
    }
    @GetMapping("/verify")
    @TokenCheck(required = false)
    public String verify(String verifyCode, HttpServletRequest request) {
        //验证码过期时间为100s
        Boolean aBoolean = kaptcha.validate(verifyCode, 10);
        if (aBoolean){
            return "验证码校验通过";
        }
        return "验证码校验失败";
}

验证

统一异常处理

使用注解@RestControllerAdvice 创建GlobalExceptionHandler类

@RestControllerAdvice
public class GlobalExceptionHandler {
    //处理验证码异常
    @ExceptionHandler(KaptchaException.class)
    public ResultWrapper kcaptchaException(KaptchaException k){
        if (k instanceof KaptchaTimeoutException){
            return ResultWrapper.getFailBuilder().code(315).msg("验证码超时").build();
        }else if (k instanceof KaptchaIncorrectException){
            return ResultWrapper.getFailBuilder().code(316).msg("验证码错误").build();
        }else if(k instanceof KaptchaNotFoundException){
            return ResultWrapper.getFailBuilder().code(317).msg("验证码未找到").build();
        }else {
            return ResultWrapper.getFailBuilder().code(318).msg("验证码未知错误").build();
        }
    }
}

ResultWrapper类

@Data
@Builder
public class ResultWrapper<T> implements Serializable {
    //状态码
    private int code;
    //提示信息
    private String msg;
    //返回信息
    private T date;

    /**
     * 返回成功的包装
     * @return
     */
    public static ResultWrapper.ResultWrapperBuilder getSuccessBuilder(){
        return ResultWrapper.builder().code(StateCodeEnum.SUCCESS.getCode()).msg(StateCodeEnum.SUCCESS.getMsg());
    }

    /**
     *
     * @return
     */
    public static ResultWrapper.ResultWrapperBuilder getFailBuilder(){
        return ResultWrapper.builder().code(StateCodeEnum.FAIL.getCode()).msg(StateCodeEnum.FAIL.getMsg());
    }
}

枚举类

public enum StateCodeEnum {

    /**
     * 用户名密码不正确
     */
    PASSWORD_ERROR(1001,"用户名密码不正确"),

    /**
     * 用户不存在
     */
    USER_EMPTY(1002,"用户不存在"),

    /**
     * 请求失败
     */
    FAIL(500,"请求失败"),
    /**
     * 请求成功
     */
    SUCCESS(200,"请求成功");

    private  int code;
    private String msg;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    StateCodeEnum(int code , String msg){
        this.code = code;
        this.msg = msg;
    }
}

kcaptcha验证码的配置

#kaptcha的默认配置可以自己更改
kaptcha:
  height: 50  #高
  width: 200  #宽
  content:
    length: 5 #出现的个数
    source: abc12345678woshizhongguoren #出现的字符
    space: 2 #间隙
  font: #字体
    color: black
    name: Arial
    size: 40
  background-color: #背景颜色
    from: red
    to: white
  border: #边框
    enabled: true
    color: black
    thickness: 1