• Springboot 之整合(全局异常、响应式封装类、JSR303验证、自定义注解)效验登录状态


    目录

    1. springboot 整合全局异常、响应式封装类效验登录状态

     1.1 在pom.xml文件添加以下相关依赖

     1.2 model模块代码

     1.3 utils模块

     1.4 exception模块

     1.5 controller模块

    2. springboot 整合全局异常 + 响应式封装类 + JSR303后端验证 + 自定义注解 效验登录状态

    2.1 添加pom.xml 相关依赖

    2.2 utils模块

    2.3  annotation模块

    2.4 validation模块

    2.5 model模块

    2.6 exception模块 

    2.7 controller模块


    前言

     第一种方式采用springboot 整合全局异常 + 响应式封装类进行效验登录状态

     第二种方式通过springboot 整合全局异常 + 响应式封装类 + JSR303后端验证 + 自定义注解效验     登录状态

    1. springboot 整合全局异常、响应式封装类效验登录状态

      1.1 在pom.xml文件添加以下相关依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-freemarkerartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-jdbcartifactId>
    8. dependency>
    9. <dependency>
    10. <groupId>org.springframework.bootgroupId>
    11. <artifactId>spring-boot-starter-webartifactId>
    12. dependency>
    13. <dependency>
    14. <groupId>org.mybatis.spring.bootgroupId>
    15. <artifactId>mybatis-spring-boot-starterartifactId>
    16. <version>2.2.2version>
    17. dependency>
    18. <dependency>
    19. <groupId>mysqlgroupId>
    20. <artifactId>mysql-connector-javaartifactId>
    21. <scope>runtimescope>
    22. <version>5.1.44version>
    23. dependency>
    24. <dependency>
    25. <groupId>org.projectlombokgroupId>
    26. <artifactId>lombokartifactId>
    27. <optional>trueoptional>
    28. dependency>
    29. <dependency>
    30. <groupId>org.apache.commonsgroupId>
    31. <artifactId>commons-lang3artifactId>
    32. <version>3.12.0version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.springframework.bootgroupId>
    36. <artifactId>spring-boot-starter-validationartifactId>
    37. <version>2.7.4version>
    38. dependency>

       1.2 model模块代码

          User 

    1. package com.jmh.springboot03.model;
    2. import com.jmh.springboot03.annotation.IsUserName;
    3. import lombok.Data;
    4. import javax.validation.constraints.NotBlank;
    5. /**
    6. * @author 蒋明辉
    7. * @data 2022/9/29 17:09
    8. */
    9. @Data
    10. public class User {
    11. //手机号码
    12. private String username;
    13. //密码
    14. private String password;
    15. }

      1.3 utils模块

        JsonResponseStatus 这是个枚举类

    1. package com.jmh.springboot03.utils;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Getter;
    4. import lombok.NoArgsConstructor;
    5. /**
    6. * @author 蒋明辉
    7. * @data 2022/9/26 17:36
    8. */
    9. @Getter
    10. @NoArgsConstructor
    11. @AllArgsConstructor
    12. public enum JsonResponseStatus {
    13. success(200,"ok"),
    14. error(500,"内部异常"),
    15. operation_success(2000,"操作成功"),
    16. operation_failed(5000,"操作失败"),
    17. name_empty(20000,"手机号码不能为空"),
    18. pwd_empty(50000,"密码不能为空"),
    19. name_pwd_empty(251,"手机号或者密码为空"),
    20. name_error(20001,"手机号码格式错误")
    21. ;
    22. //响应代码
    23. private int code;
    24. //响应信息
    25. private String msg;
    26. }

       JsonResponseBody 这是个泛型类

    1. package com.jmh.springboot03.utils;
    2. import lombok.Data;
    3. /**
    4. * @author 蒋明辉
    5. * @data 2022/9/26 17:38
    6. */
    7. @Data
    8. public class JsonResponseBody {
    9. //响应代码
    10. private int code;
    11. //响应信息
    12. private String msg;
    13. //响应数据
    14. private T data;
    15. //响应总记录数
    16. private int total=0;
    17. public JsonResponseBody(){
    18. this.code= JsonResponseStatus.success.getCode();
    19. this.msg=JsonResponseStatus.success.getMsg();
    20. }
    21. public JsonResponseBody(JsonResponseStatus jsonResponseStatus){
    22. this.code=jsonResponseStatus.getCode();
    23. this.msg=jsonResponseStatus.getMsg();
    24. }
    25. public JsonResponseBody(T data){
    26. this.data=data;
    27. this.code=JsonResponseStatus.success.getCode();
    28. this.msg=JsonResponseStatus.success.getMsg();
    29. }
    30. public JsonResponseBody(T data,int total){
    31. this.data=data;
    32. this.total=total;
    33. this.code=JsonResponseStatus.success.getCode();
    34. this.msg=JsonResponseStatus.success.getMsg();
    35. }
    36. }

       ValidatorUtils 验证手机号码格式的工具类

    1. package com.jmh.springboot03.utils;
    2. import org.apache.commons.lang3.StringUtils;
    3. import java.util.regex.Matcher;
    4. import java.util.regex.Pattern;
    5. /**
    6. * 正则校验工具类
    7. * @author 刘开宇
    8. */
    9. public class ValidatorUtils {
    10. private static final Pattern mobile_pattern=Pattern.compile("[1]([0-9])[0-9]{9}$");
    11. public static boolean isMobile(String mobile){
    12. if(StringUtils.isEmpty(mobile))
    13. return false;
    14. Matcher matcher = mobile_pattern.matcher(mobile);
    15. return matcher.matches();
    16. }
    17. }

      1.4 exception模块

        BusinessException

    1. package com.jmh.springboot03.exception;
    2. import com.jmh.springboot03.utils.JsonResponseBody;
    3. import com.jmh.springboot03.utils.JsonResponseStatus;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. /**
    8. * @author 蒋明辉
    9. * @data 2022/9/29 18:24
    10. */
    11. @Data
    12. @AllArgsConstructor
    13. @NoArgsConstructor
    14. public class BusinessException extends RuntimeException{
    15. private JsonResponseStatus jsonResponseStatus;
    16. }

       GlobalExceptionHandler

    1. package com.jmh.springboot03.exception;
    2. import com.jmh.springboot03.utils.JsonResponseBody;
    3. import com.jmh.springboot03.utils.JsonResponseStatus;
    4. import org.springframework.validation.BindException;
    5. import org.springframework.web.bind.annotation.ExceptionHandler;
    6. import org.springframework.web.bind.annotation.RestControllerAdvice;
    7. /**
    8. * @author 蒋明辉
    9. * @data 2022/9/29 18:26
    10. */
    11. @RestControllerAdvice
    12. public class GlobalExceptionHandler {
    13. @ExceptionHandler
    14. public JsonResponseBody exceptionHandler(Exception e){
    15. //e.printStackTrace();//打印异常信息
    16. //定义一个jsonResponseBody
    17. JsonResponseBody jsonResponseBody=null;
    18. if(e instanceof BusinessException) {//是否是BusinessException异常
    19. //强转为BusinessException
    20. BusinessException businessException = (BusinessException) e;
    21. //实例化jsonResponseBody
    22. jsonResponseBody = new JsonResponseBody<>(businessException.getJsonResponseStatus());
    23. }else {
    24. jsonResponseBody=new JsonResponseBody<>(JsonResponseStatus.error);
    25. }
    26. return jsonResponseBody;
    27. }
    28. }

     1.5 controller模块

       LoginController

    1. package com.jmh.springboot03.controller;
    2. import com.jmh.springboot03.exception.BusinessException;
    3. import com.jmh.springboot03.model.User;
    4. import com.jmh.springboot03.utils.JsonResponseBody;
    5. import com.jmh.springboot03.utils.JsonResponseStatus;
    6. import com.jmh.springboot03.utils.ValidatorUtils;
    7. import org.apache.commons.lang3.StringUtils;
    8. import org.springframework.stereotype.Controller;
    9. import org.springframework.validation.annotation.Validated;
    10. import org.springframework.web.bind.annotation.RequestMapping;
    11. import org.springframework.web.bind.annotation.RestController;
    12. /**
    13. * @author 蒋明辉
    14. * @data 2022/9/29 17:06
    15. */
    16. @RestController
    17. @RequestMapping("/user")
    18. public class LoginController {
    19. @RequestMapping("/toLogin")
    20. public JsonResponseBody toLogin(User user){
    21. //1.判断手机号或者密码不能为空
    22. if(StringUtils.isEmpty(user.getUsername())||StringUtils.isEmpty(user.getPassword())){
    23. //抛给全局异常处理
    24. throw new BusinessException(JsonResponseStatus.name_pwd_empty);
    25. }
    26. //2.判断手机格式
    27. if(!ValidatorUtils.isMobile(user.getUsername())){
    28. //抛给全局异常处理
    29. throw new BusinessException(JsonResponseStatus.name_error);
    30. }
    31. return new JsonResponseBody<>();
    32. }
    33. }

    2. springboot 整合全局异常 + 响应式封装类 + JSR303后端验证 + 自定义注解 效验登录状态

      2.1 添加pom.xml 相关依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-freemarkerartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-jdbcartifactId>
    8. dependency>
    9. <dependency>
    10. <groupId>org.springframework.bootgroupId>
    11. <artifactId>spring-boot-starter-webartifactId>
    12. dependency>
    13. <dependency>
    14. <groupId>org.mybatis.spring.bootgroupId>
    15. <artifactId>mybatis-spring-boot-starterartifactId>
    16. <version>2.2.2version>
    17. dependency>
    18. <dependency>
    19. <groupId>mysqlgroupId>
    20. <artifactId>mysql-connector-javaartifactId>
    21. <scope>runtimescope>
    22. <version>5.1.44version>
    23. dependency>
    24. <dependency>
    25. <groupId>org.projectlombokgroupId>
    26. <artifactId>lombokartifactId>
    27. <optional>trueoptional>
    28. dependency>
    29. <dependency>
    30. <groupId>org.apache.commonsgroupId>
    31. <artifactId>commons-lang3artifactId>
    32. <version>3.12.0version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.springframework.bootgroupId>
    36. <artifactId>spring-boot-starter-validationartifactId>
    37. <version>2.7.4version>
    38. dependency>

      2.2 utils模块

       JsonResponseStastus 这是一个枚举类

    1. package com.jmh.springboot03.utils;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Getter;
    4. import lombok.NoArgsConstructor;
    5. /**
    6. * @author 蒋明辉
    7. * @data 2022/9/26 17:36
    8. */
    9. @Getter
    10. @NoArgsConstructor
    11. @AllArgsConstructor
    12. public enum JsonResponseStatus {
    13. success(200,"ok"),
    14. error(500,"内部异常"),
    15. operation_success(2000,"操作成功"),
    16. operation_failed(5000,"操作失败"),
    17. name_empty(20000,"手机号码不能为空"),
    18. pwd_empty(50000,"密码不能为空"),
    19. name_pwd_empty(251,"手机号或者密码为空"),
    20. name_error(20001,"手机号码格式错误")
    21. ;
    22. //响应代码
    23. private int code;
    24. //响应信息
    25. private String msg;
    26. }

       JsonResponseBody 这是一个泛型类

    1. package com.jmh.springboot03.utils;
    2. import lombok.Data;
    3. /**
    4. * @author 蒋明辉
    5. * @data 2022/9/26 17:38
    6. */
    7. @Data
    8. public class JsonResponseBody {
    9. //响应代码
    10. private int code;
    11. //响应信息
    12. private String msg;
    13. //响应数据
    14. private T data;
    15. //响应总记录数
    16. private int total=0;
    17. public JsonResponseBody(){
    18. this.code= JsonResponseStatus.success.getCode();
    19. this.msg=JsonResponseStatus.success.getMsg();
    20. }
    21. public JsonResponseBody(JsonResponseStatus jsonResponseStatus){
    22. this.code=jsonResponseStatus.getCode();
    23. this.msg=jsonResponseStatus.getMsg();
    24. }
    25. public JsonResponseBody(T data){
    26. this.data=data;
    27. this.code=JsonResponseStatus.success.getCode();
    28. this.msg=JsonResponseStatus.success.getMsg();
    29. }
    30. public JsonResponseBody(T data,int total){
    31. this.data=data;
    32. this.total=total;
    33. this.code=JsonResponseStatus.success.getCode();
    34. this.msg=JsonResponseStatus.success.getMsg();
    35. }
    36. }

       ValidatorUtils 这是一个效验手机号码格式的工具类

    1. package com.jmh.springboot03.utils;
    2. import org.apache.commons.lang3.StringUtils;
    3. import java.util.regex.Matcher;
    4. import java.util.regex.Pattern;
    5. /**
    6. * 正则校验工具类
    7. * @author 刘开宇
    8. */
    9. public class ValidatorUtils {
    10. private static final Pattern mobile_pattern=Pattern.compile("[1]([0-9])[0-9]{9}$");
    11. public static boolean isMobile(String mobile){
    12. if(StringUtils.isEmpty(mobile))
    13. return false;
    14. Matcher matcher = mobile_pattern.matcher(mobile);
    15. return matcher.matches();
    16. }
    17. }

     2.3  annotation模块

        IsUserName 这是一个注解类

    1. package com.jmh.springboot03.annotation;
    2. import com.jmh.springboot03.validation.UserNameValidation;
    3. import javax.validation.Constraint;
    4. import javax.validation.Payload;
    5. import java.lang.annotation.*;
    6. /**
    7. * @author 蒋明辉
    8. * @data 2022/9/29 19:02
    9. */
    10. @Documented
    11. @Constraint(
    12. validatedBy = {UserNameValidation.class}
    13. )
    14. @Target({ElementType.FIELD})
    15. @Retention(RetentionPolicy.RUNTIME)
    16. public @interface IsUserName {
    17. boolean require() default true;
    18. String message() default "手机号码格式错误";
    19. Class[] groups() default {};
    20. Classextends Payload>[] payload() default {};
    21. }

    2.4 validation模块

       UserNameValidation

    1. package com.jmh.springboot03.validation;
    2. import com.jmh.springboot03.annotation.IsUserName;
    3. import com.jmh.springboot03.utils.ValidatorUtils;
    4. import org.springframework.validation.annotation.Validated;
    5. import javax.validation.ConstraintValidator;
    6. import javax.validation.ConstraintValidatorContext;
    7. /**
    8. * @author 蒋明辉
    9. * @data 2022/9/29 19:19
    10. */
    11. public class UserNameValidation implements ConstraintValidator {
    12. private boolean required=true;
    13. @Override
    14. public void initialize(IsUserName constraintAnnotation) {
    15. //将IsUserName注解的值赋值给required
    16. this.required=constraintAnnotation.require();
    17. }
    18. @Override
    19. public boolean isValid(String username, ConstraintValidatorContext constraintValidatorContext) {
    20. //如果required是等于false的就代码不需要验证就进行下一步操作
    21. if (!required){//取反
    22. return true;//true就继续验证下一步 false代码不继续下面操作
    23. }
    24. return ValidatorUtils.isMobile(username);
    25. }
    26. }

    2.5 model模块

       User 

    1. package com.jmh.springboot03.model;
    2. import com.jmh.springboot03.annotation.IsUserName;
    3. import lombok.Data;
    4. import javax.validation.constraints.NotBlank;
    5. /**
    6. * @author 蒋明辉
    7. * @data 2022/9/29 17:09
    8. */
    9. @Data
    10. public class User {
    11. @NotBlank(message ="手机号码不能为空")
    12. @IsUserName(require = true)//这一个注解是自己自定义的注解
    13. //手机号码
    14. private String username;
    15. @NotBlank(message = "密码不能为空")
    16. //密码
    17. private String password;
    18. }

      2.6 exception模块 

        BusinessException

    1. package com.jmh.springboot03.exception;
    2. import com.jmh.springboot03.utils.JsonResponseBody;
    3. import com.jmh.springboot03.utils.JsonResponseStatus;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. /**
    8. * @author 蒋明辉
    9. * @data 2022/9/29 18:24
    10. */
    11. @Data
    12. @AllArgsConstructor
    13. @NoArgsConstructor
    14. public class BusinessException extends RuntimeException{
    15. private JsonResponseStatus jsonResponseStatus;
    16. }

       GlobalExceptionHandler

    1. package com.jmh.springboot03.exception;
    2. import com.jmh.springboot03.utils.JsonResponseBody;
    3. import com.jmh.springboot03.utils.JsonResponseStatus;
    4. import org.springframework.validation.BindException;
    5. import org.springframework.web.bind.annotation.ExceptionHandler;
    6. import org.springframework.web.bind.annotation.RestControllerAdvice;
    7. /**
    8. * @author 蒋明辉
    9. * @data 2022/9/29 18:26
    10. */
    11. @RestControllerAdvice
    12. public class GlobalExceptionHandler {
    13. @ExceptionHandler
    14. public JsonResponseBody exceptionHandler(Exception e){
    15. //e.printStackTrace();//打印异常信息
    16. //定义一个jsonResponseBody
    17. JsonResponseBody jsonResponseBody=null;
    18. if(e instanceof BindException){//是否是BindException异常
    19. //强转为BindException
    20. BindException bindException=(BindException)e;
    21. //实例化jsonResponseBody
    22. jsonResponseBody=new JsonResponseBody<>();
    23. //获取异常信息
    24. String me = bindException.getFieldError().getDefaultMessage();
    25. //将异常信息赋值给jsonResponseBody
    26. jsonResponseBody.setCode(20020929);
    27. jsonResponseBody.setMsg(me);
    28. }else {
    29. jsonResponseBody=new JsonResponseBody<>(JsonResponseStatus.error);
    30. }
    31. return jsonResponseBody;
    32. }
    33. }

      2.7 controller模块

       LoginController

    1. package com.jmh.springboot03.controller;
    2. import com.jmh.springboot03.exception.BusinessException;
    3. import com.jmh.springboot03.model.User;
    4. import com.jmh.springboot03.utils.JsonResponseBody;
    5. import com.jmh.springboot03.utils.JsonResponseStatus;
    6. import com.jmh.springboot03.utils.ValidatorUtils;
    7. import org.apache.commons.lang3.StringUtils;
    8. import org.springframework.stereotype.Controller;
    9. import org.springframework.validation.annotation.Validated;
    10. import org.springframework.web.bind.annotation.RequestMapping;
    11. import org.springframework.web.bind.annotation.RestController;
    12. /**
    13. * @author 蒋明辉
    14. * @data 2022/9/29 17:06
    15. */
    16. @RestController
    17. @RequestMapping("/user")
    18. public class LoginController {
    19. @RequestMapping("/toLogin")
    20. public JsonResponseBody toLogin(@Validated User user){
    21. //不要慌哈! 虽然这里没有代码但是我们已经都交给JSR303 全局异常去做啦
    22. return new JsonResponseBody<>();
    23. }
    24. }

     

  • 相关阅读:
    【Java面试】如何理解Spring Boot中的Starter?
    线程池执行的用户任务抛出异常会怎样
    SQLAlchemy 连接池
    【vue+nestjs】qq第三方授权登录【超详细】
    在机器学习领域中,One-Hot Encoding是什么
    Java--Spring事务
    Mybatis 框架 ( 四 ) QueryWrapper
    Python面试题:请解释 `__slots__` 的作用
    Map集合(TreeMap)的使用
    经纬高坐标转东北天坐标
  • 原文地址:https://blog.csdn.net/m0_63300795/article/details/127114996