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

目录

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

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

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

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


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

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

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

二、发送请求时,携带发送的数据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签名校验-优快云博客

四、实现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);
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

探索星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值