当前位置: 首页 > article >正文

SpringBoot3 + Vue3 由浅入深的交互 基础交互教学2

目录

一、这篇文章是基础交互教学系列的续作

二、发送请求时,携带发送的数据json格式的参数:data

三、携带token请求头,进行JWT校验

四、实现throw抛出异常,并交互显示在前端的界面


一、这篇文章是基础交互教学系列的续作

大家可以看看我之前的文章,里面有详细的搭建环境过程:

SpringBoot3 + Vue3 由浅入深的交互 基础交互教学_springboot和vue怎么交互-CSDN博客

二、发送请求时,携带发送的数据json格式的参数:data

之前只是讲解了如何路径参数的方式发起和响应请求,这次将会讲解通过json格式参数发起和响应请求:

以登录界面为例,将向后端发送表单

首先通过ref创建form的表单

const form = ref({
  username:'',
  password:'',
})

 用户在输入账号和密码后,通过点击登录按钮,触发登录的事件:

const handleLogin = async () => {
  const response = await apiUserLoginService(form.value);
  if (response && response.code === 200) {
    const token = response.data;

    // 存储token到localStorage
    localStorage.setItem('token', token);
    ElMessage({ type: 'success', message:  '登录成功!' });
    router.push('/home');
  } 
  
};

 发现没有,直接传入的是表单的值:

在api/userApis.js中:

这里将定义前端发送的数据请求方法和数据

import request from '@/utils/request.js'
 
export const apiUserLoginService = (data)=>{
    return request.post('/user/login',data)
}

 后端的代码,接收请求的参数使用的是@RequestBody注解

    @PostMapping("/login")
    public Result<String> loginByPassword(@RequestBody UserLoginForm userLoginForm){
        String token  = userService.loginByPassword(userLoginForm);
        return !StringUtil.isNullOrEmpty(token) ? Result.success(token):Result.fail(ResultCodeEnum.FAIL);
    }

其中UserLoginForm类定义的变量,对应着前端form表单发送过来的参数名username和password

@Data
public class UserLoginForm {

    private String username;

    private String password;

}

三、携带token请求头,进行JWT校验

在登录的时候存入token的参数

const handleLogin = async () => {
  const response = await apiUserLoginService(form.value);
  if (response && response.code === 200) {
    const token = response.data;

    // 存储token到localStorage
    localStorage.setItem('token', token);
    ElMessage({ type: 'success', message:  '登录成功!' });
    router.push('/home');
  } 
  
};

修改utils/request.js中的代码:

使每次请求如果存在token则会携带token进行校验

import axios from "axios";
import { ElMessage } from "element-plus";

const baseURL = '/api';

const token = localStorage.getItem("token");
const instance = axios.create({
    baseURL,
    headers: {
        "Content-Type": "application/json",
        "Authorization":token || []
    },
})
 
instance.interceptors.response.use(
    result=>{
        return result.data;
    },
    err=>{
        ElMessage({ type: 'warning', message: err.response.data.message});
        return Promise.reject(err);
    }
 
)
 
export default instance;

关于JWT后端校验的代码,大家可以看看我之前写的JWT认证校验这篇文章,里面有更详细的讲解,这里我就不多赘述了

JWT 认证校验 从理论到实战(登录校验)_jwt签名校验-CSDN博客

四、实现throw抛出异常,并交互显示在前端的界面

 throw抛出异常,大家想必在项目中经常使用吧,还是以登录为例:

如果登录的用户不存在,则会抛出用户不存在的异常 

        //1.判断用户是否存在
        User user = selectUserByName(username);

        if(user == null){
            throw new BusinessRuntimeException(ResultCodeEnum.ACCOUNT_NOT_EXIST);
        }

直接抛出异常,前端是无法获取到的,这时需要创建一个全局异常类,将捕获到的异常返回给前端,这样前端就可以通过异常的信息进行显示

exception/GlobalException中,定义了处理自定义抛出的异常类BusinessRuntimeException,并捕获到的异常将返回给前端

@ControllerAdvice
public class GlobalException {

    // 处理 BusinessRuntimeException
    @ExceptionHandler(BusinessRuntimeException.class)
    public ResponseEntity<Object> handleBusinessException(BusinessRuntimeException ex, WebRequest request) {
        Map<String, Object> body = new HashMap<>();
        body.put("message", ex.getResultCodeEnum().getMsg());
        body.put("code",ex.getResultCodeEnum().getCode());
        return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
    }
}

然后前端就只需要将该异常进行显示出来,提示用户即可完成了交互 


http://www.kler.cn/a/419911.html

相关文章:

  • 论文阅读——量子退火Experimental signature of programmable quantum annealing
  • 重学设计模式-工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
  • 【docker】Overlay网络
  • Vue2-从零搭建一个项目(项目基本结构介绍)
  • 【Docker】Docker 容器日志过大导致磁盘爆满
  • webpack5开发环境、生产环境配置 (三)
  • 数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)
  • CSS学习记录03
  • NLP 的发展历程
  • 洛谷 P1308 [NOIP2011 普及组] 统计单词数 C语言
  • 对于大规模的淘宝API接口数据,有什么高效的处理方法?
  • 2. langgraph中的Tool Calling (How to handle tool calling errors)
  • AI在SEO中的应用与关键词优化探讨
  • 011变长子网掩码
  • React 前端框架1
  • <<WTF-Solidity>>学习笔记(part 25-28)
  • 物联网——WatchDog(监听器)
  • 关于正点原子STM32F404探索者V3ZGT6 RS232串口的使用
  • navicat连接mysql 8.0以上版本2059错误
  • Gazebo插件相机传感器(可订阅/camera/image_raw话题)
  • OpenCV_Code_LOG
  • IT监控:Perseus采集平台的介绍
  • Java 并发基础之 Java NIO 详解
  • openssl哈希算法
  • 【Spring Security框架解析】
  • 【C++】set的使用