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文件添加以下相关依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--工具依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <!--303验证依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.7.4</version>
        </dependency>

   1.2 model模块代码

      User 

package com.jmh.springboot03.model;

import com.jmh.springboot03.annotation.IsUserName;
import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @author 蒋明辉
 * @data 2022/9/29 17:09
 */
@Data
public class User {
    //手机号码
    private String username;
    //密码
    private String password;
}

  1.3 utils模块

    JsonResponseStatus 这是个枚举类

package com.jmh.springboot03.utils;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * @author 蒋明辉
 * @data 2022/9/26 17:36
 */
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum JsonResponseStatus {

    success(200,"ok"),
    error(500,"内部异常"),
    operation_success(2000,"操作成功"),
    operation_failed(5000,"操作失败"),
    name_empty(20000,"手机号码不能为空"),
    pwd_empty(50000,"密码不能为空"),
    name_pwd_empty(251,"手机号或者密码为空"),
    name_error(20001,"手机号码格式错误")
    ;

    //响应代码
    private int code;
    //响应信息
    private String msg;
}

   JsonResponseBody 这是个泛型类

package com.jmh.springboot03.utils;

import lombok.Data;

/**
 * @author 蒋明辉
 * @data 2022/9/26 17:38
 */
@Data
public class JsonResponseBody<T> {

    //响应代码
    private int code;
    //响应信息
    private String msg;
    //响应数据
    private T data;
    //响应总记录数
    private int total=0;

    public JsonResponseBody(){
        this.code= JsonResponseStatus.success.getCode();
        this.msg=JsonResponseStatus.success.getMsg();
    }

    public JsonResponseBody(JsonResponseStatus jsonResponseStatus){
        this.code=jsonResponseStatus.getCode();
        this.msg=jsonResponseStatus.getMsg();
    }

    public JsonResponseBody(T data){
        this.data=data;
        this.code=JsonResponseStatus.success.getCode();
        this.msg=JsonResponseStatus.success.getMsg();
    }

    public JsonResponseBody(T data,int total){
        this.data=data;
        this.total=total;
        this.code=JsonResponseStatus.success.getCode();
        this.msg=JsonResponseStatus.success.getMsg();
    }

}

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

package com.jmh.springboot03.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则校验工具类
 * @author 刘开宇
 */
public class ValidatorUtils {

    private static final Pattern mobile_pattern=Pattern.compile("[1]([0-9])[0-9]{9}$");

    public static boolean isMobile(String mobile){
        if(StringUtils.isEmpty(mobile))
            return false;
        Matcher matcher = mobile_pattern.matcher(mobile);
        return matcher.matches();
    }
}

  1.4 exception模块

    BusinessException

package com.jmh.springboot03.exception;

import com.jmh.springboot03.utils.JsonResponseBody;
import com.jmh.springboot03.utils.JsonResponseStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 蒋明辉
 * @data 2022/9/29 18:24
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException{
    private JsonResponseStatus jsonResponseStatus;

}

   GlobalExceptionHandler

package com.jmh.springboot03.exception;

import com.jmh.springboot03.utils.JsonResponseBody;
import com.jmh.springboot03.utils.JsonResponseStatus;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @author 蒋明辉
 * @data 2022/9/29 18:26
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler
    public JsonResponseBody<?> exceptionHandler(Exception e){
        //e.printStackTrace();//打印异常信息
        //定义一个jsonResponseBody
        JsonResponseBody<?> jsonResponseBody=null;
        if(e instanceof BusinessException) {//是否是BusinessException异常
            //强转为BusinessException
            BusinessException businessException = (BusinessException) e;
            //实例化jsonResponseBody
            jsonResponseBody = new JsonResponseBody<>(businessException.getJsonResponseStatus());
        }else {
            jsonResponseBody=new JsonResponseBody<>(JsonResponseStatus.error);
        }
        return jsonResponseBody;
    }

}

 1.5 controller模块

   LoginController

package com.jmh.springboot03.controller;

import com.jmh.springboot03.exception.BusinessException;
import com.jmh.springboot03.model.User;
import com.jmh.springboot03.utils.JsonResponseBody;
import com.jmh.springboot03.utils.JsonResponseStatus;
import com.jmh.springboot03.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 蒋明辉
 * @data 2022/9/29 17:06
 */
@RestController
@RequestMapping("/user")
public class LoginController {

    @RequestMapping("/toLogin")
    public JsonResponseBody<?> toLogin(User user){
        //1.判断手机号或者密码不能为空
        if(StringUtils.isEmpty(user.getUsername())||StringUtils.isEmpty(user.getPassword())){
            //抛给全局异常处理
            throw new BusinessException(JsonResponseStatus.name_pwd_empty);
        }
        //2.判断手机格式
        if(!ValidatorUtils.isMobile(user.getUsername())){
            //抛给全局异常处理
            throw new BusinessException(JsonResponseStatus.name_error);
        }
        return new JsonResponseBody<>();
    }

}










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

  2.1 添加pom.xml 相关依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--工具依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <!--303验证依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.7.4</version>
        </dependency>

  2.2 utils模块

   JsonResponseStastus 这是一个枚举类

package com.jmh.springboot03.utils;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * @author 蒋明辉
 * @data 2022/9/26 17:36
 */
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum JsonResponseStatus {

    success(200,"ok"),
    error(500,"内部异常"),
    operation_success(2000,"操作成功"),
    operation_failed(5000,"操作失败"),
    name_empty(20000,"手机号码不能为空"),
    pwd_empty(50000,"密码不能为空"),
    name_pwd_empty(251,"手机号或者密码为空"),
    name_error(20001,"手机号码格式错误")
    ;

    //响应代码
    private int code;
    //响应信息
    private String msg;
}

   JsonResponseBody 这是一个泛型类

package com.jmh.springboot03.utils;

import lombok.Data;

/**
 * @author 蒋明辉
 * @data 2022/9/26 17:38
 */
@Data
public class JsonResponseBody<T> {

    //响应代码
    private int code;
    //响应信息
    private String msg;
    //响应数据
    private T data;
    //响应总记录数
    private int total=0;

    public JsonResponseBody(){
        this.code= JsonResponseStatus.success.getCode();
        this.msg=JsonResponseStatus.success.getMsg();
    }

    public JsonResponseBody(JsonResponseStatus jsonResponseStatus){
        this.code=jsonResponseStatus.getCode();
        this.msg=jsonResponseStatus.getMsg();
    }

    public JsonResponseBody(T data){
        this.data=data;
        this.code=JsonResponseStatus.success.getCode();
        this.msg=JsonResponseStatus.success.getMsg();
    }

    public JsonResponseBody(T data,int total){
        this.data=data;
        this.total=total;
        this.code=JsonResponseStatus.success.getCode();
        this.msg=JsonResponseStatus.success.getMsg();
    }

}

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

package com.jmh.springboot03.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则校验工具类
 * @author 刘开宇
 */
public class ValidatorUtils {

    private static final Pattern mobile_pattern=Pattern.compile("[1]([0-9])[0-9]{9}$");

    public static boolean isMobile(String mobile){
        if(StringUtils.isEmpty(mobile))
            return false;
        Matcher matcher = mobile_pattern.matcher(mobile);
        return matcher.matches();
    }
}

 2.3  annotation模块

    IsUserName 这是一个注解类

package com.jmh.springboot03.annotation;

import com.jmh.springboot03.validation.UserNameValidation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author 蒋明辉
 * @data 2022/9/29 19:02
 */
@Documented
@Constraint(
        validatedBy = {UserNameValidation.class}
)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IsUserName {
    boolean require() default true;

    String message() default "手机号码格式错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

2.4 validation模块

   UserNameValidation

package com.jmh.springboot03.validation;

import com.jmh.springboot03.annotation.IsUserName;
import com.jmh.springboot03.utils.ValidatorUtils;
import org.springframework.validation.annotation.Validated;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author 蒋明辉
 * @data 2022/9/29 19:19
 */
public class UserNameValidation implements ConstraintValidator<IsUserName,String> {

    private boolean required=true;

    @Override
    public void initialize(IsUserName constraintAnnotation) {
        //将IsUserName注解的值赋值给required
        this.required=constraintAnnotation.require();

    }

    @Override
    public boolean isValid(String username, ConstraintValidatorContext constraintValidatorContext) {
        //如果required是等于false的就代码不需要验证就进行下一步操作
        if (!required){//取反
            return true;//true就继续验证下一步 false代码不继续下面操作
        }
        return ValidatorUtils.isMobile(username);
    }
}

2.5 model模块

   User 

package com.jmh.springboot03.model;

import com.jmh.springboot03.annotation.IsUserName;
import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @author 蒋明辉
 * @data 2022/9/29 17:09
 */
@Data
public class User {
    @NotBlank(message ="手机号码不能为空")
    @IsUserName(require = true)//这一个注解是自己自定义的注解
    //手机号码
    private String username;
    @NotBlank(message = "密码不能为空")
    //密码
    private String password;
}

  2.6 exception模块 

    BusinessException

package com.jmh.springboot03.exception;

import com.jmh.springboot03.utils.JsonResponseBody;
import com.jmh.springboot03.utils.JsonResponseStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 蒋明辉
 * @data 2022/9/29 18:24
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException{
    private JsonResponseStatus jsonResponseStatus;

}

   GlobalExceptionHandler

package com.jmh.springboot03.exception;

import com.jmh.springboot03.utils.JsonResponseBody;
import com.jmh.springboot03.utils.JsonResponseStatus;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @author 蒋明辉
 * @data 2022/9/29 18:26
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler
    public JsonResponseBody<?> exceptionHandler(Exception e){
        //e.printStackTrace();//打印异常信息
        //定义一个jsonResponseBody
        JsonResponseBody<?> jsonResponseBody=null;
        if(e instanceof BindException){//是否是BindException异常
            //强转为BindException
            BindException bindException=(BindException)e;
            //实例化jsonResponseBody
            jsonResponseBody=new JsonResponseBody<>();
            //获取异常信息
            String me = bindException.getFieldError().getDefaultMessage();
            //将异常信息赋值给jsonResponseBody
            jsonResponseBody.setCode(20020929);
            jsonResponseBody.setMsg(me);

        }else {
            jsonResponseBody=new JsonResponseBody<>(JsonResponseStatus.error);
        }
        return jsonResponseBody;
    }

}

  2.7 controller模块

   LoginController

package com.jmh.springboot03.controller;

import com.jmh.springboot03.exception.BusinessException;
import com.jmh.springboot03.model.User;
import com.jmh.springboot03.utils.JsonResponseBody;
import com.jmh.springboot03.utils.JsonResponseStatus;
import com.jmh.springboot03.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 蒋明辉
 * @data 2022/9/29 17:06
 */
@RestController
@RequestMapping("/user")
public class LoginController {

    @RequestMapping("/toLogin")
    public JsonResponseBody<?> toLogin(@Validated User user){
        //不要慌哈! 虽然这里没有代码但是我们已经都交给JSR303 全局异常去做啦
        return new JsonResponseBody<>();
    }

}









 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值