目录
1. springboot 整合全局异常、响应式封装类效验登录状态
2. springboot 整合全局异常 + 响应式封装类 + JSR303后端验证 + 自定义注解 效验登录状态
前言
第一种方式采用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<>();
}
}