SpringBoot+vue中@Valid表单验证并返回给前端

总共分为3大步

1) 完成表单验证

1.导入表单验证依赖
<!-- 表单后端校验 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
        <version>2.3.3.RELEASE</version>
    </dependency>
	
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
2.在Controler中的login方法的参数加上@Valid注解,
这里是将表单参数都写到一个自定义的接受参数类,前端传过来的三个参数都会作为属性存储到该类的对象中,
这个类中调用validation包的注解来设置校验的内容

image
image
image

2) 捕获消息并返回给前端

表单验证到这里还没有结束,因为前面只设置了表单需要验证的内容,而我们现在要处理当不满足验证的需求时的情况

//自定义返回类: ApiResult
//所有信息都会存入该类的属性传给前端

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.util.Date;

@Data
@JsonInclude(JsonInclude.Include.ALWAYS)
public class ApiResult<T> {
    int status;
    boolean success;
    String message;
    T data;
    Date time;

    public ApiResult(int status, boolean success, String message, T data) {
        this.status = status;
        this.success = success;
        this.message = message;
        this.data = data;
        this.time = new Date();
    }

    public static <T> ApiResult<T> ok(){
        return new ApiResult(200,true,"register successful",null);
    }

    public static <T> ApiResult<T> ok(String message){
        return new ApiResult(200,true,message,null);
    }
    public static <T> ApiResult<T> ok(T data){
        return new ApiResult(200,true,"register successful",data);
    }
    public static <T> ApiResult<T> ok(String message,T data){
        return new ApiResult(200,true,message,data);
    }

    public static <T> ApiResult<T> create(){
        return new ApiResult(201,true,"register successful",null);
    }
    public static <T> ApiResult<T> create(String message){
        return new ApiResult(201,true,message,null);
    }
    public static <T> ApiResult<T> create(T data){
        return new ApiResult(201,true,"register successful",data);
    }
    public static <T> ApiResult<T> create(String message,T data){
        return new ApiResult(201,true,message,data);
    }

    public static <T> ApiResult<T> notFound(String msg) {
        return new ApiResult(404,false,msg,null);
    }
    public static <T> ApiResult<T> failedMsg(int code, String msg) {
        return new ApiResult(code,false,msg,null);
    }

}

 
```创建一个exception包,再分别创建两个类。再创建一个自定义返回类ApiResult```
//第一个异常类LoginException继承与RuntimeException类

import org.springframework.http.HttpStatus;

import static org.springframework.http.HttpStatus.UNAUTHORIZED;

public class LoginException extends RuntimeException{
    private Integer status = UNAUTHORIZED.value();

    public LoginException(String msg){
        super(msg);
    }

    public LoginException(HttpStatus status, String msg){
        super(msg);
        this.status = status.value();
    }
}
//第二个异常类: ExceptionAdvice

import com.example.securityreview.coomon.api.ApiResult;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.security.auth.login.LoginException;

@RestControllerAdvice
public class ExceptionAdvice {

    private final static String EXCEPTION_MSG_KEY = "Exception message : ";

    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ExceptionHandler({LoginException.class}) //这里就是写入有@Vaild注解的那个累
    public ApiResult loginException(LoginException e){ //LoginException就是第一个异常类
        return ApiResult.failedMsg(HttpStatus.UNAUTHORIZED.value(), e.getMessage()); //HttpStatus是Spring自带的状态封装枚举类(200,400,404,500,....)
    }

}

到此,后端的所有配置皆已完成

3) 前端获取消息并输出该消息

后端已经可以把消息封装在ApiResult自定义返回对象返回给前端,那么前端该怎么处理呢?
image

从图片可以看出, 当不符合验证条件时发送登录请求到后端,
则会先经过@Valid和类中的验证注解,如果不符合条件,
则会被ExceptionAdvice类中的loginException方法捕获到(这个过程会和第一个异常类LoginException进行配合),
并通过自定义返回类ApiResult返回给前端,前端拿到数据后,进行输出

image
image

原创分享,有什么问题可以交流一下

posted @ 2022-06-26 16:38  黄伟鸿  阅读(954)  评论(0编辑  收藏  举报