SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装

本文详细介绍了在SpringBoot+Vue前后端分离项目中如何进行全局异常处理和统一结果封装。后端通过@RestControllerAdvice实现全局异常捕获,前端利用axios的后置拦截器处理响应。同时,文章提供了一个简单的Result类示例,用于封装请求结果,确保前后端交互的标准化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装

前后端分离开发中的异常处理

  在我们的前后端分离项目中,有时候不可避免发生后端服务报错抛出异常的情况,如果不配置全局异常处理机制,就会默认返回tomcat或者nginx的5XX页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简单的格式给前端,然后再由前端给用户返回能够使其理解的报错信息,而不是抛一个java exception给用户。
  后端给前端返回错误信息,前端需要能接收到此错误信息并告知用户,也即前端也需要进行异常处理,在Vue项目中,前端都是用axios向后端发送请求,前端需要配置全局axios拦截器,拦截后端给我们返回的http response,判断请求是否成功,失败的话则返回相应错误信息
  在上述前后端交互的过程中,有必要统一一个结果返回封装类,这样前后端交互的时候有个统一的标准,约定结果返回的数据是正常的或者遇到异常了。否则后端返回的数据五花八门,前端也无法判断请求是否成功了

统一结果封装

  统一结果封装是由前后端协商共同确定的,对于不同的项目可能封装类不同。
  在此我们用一个简单的统一结果封装类来演示这个前后端交互的重要环节。一般来说,统一结果封装类里面有几个要素必要的:

  • 请求是否成功,可用code表示(如200表示成功,400表示异常)
  • 请求结果消息message
  • 请求结果数据data

  这里我们用一个Result类来表示统一结果封装类,那么Result类里肯定有以下三个属性了:
在这里插入图片描述
  Result里应该有哪些方法呢?请求只有成功和失败两种情况,Result里应定义静态方法,用以生成Result对象返回给前端,参数即为Result对象的3个属性,于是我们定义以下两个方法:
在这里插入图片描述
  光有这两个方法还不够,因为这两个方法并不是特别方便使用。对于大部分请求成功的情况,code就是200,请求成功的message其实并不重要,data才是前端需要的,也就是说,在大部分请求成功的情况下,我们只要把data传给前端就行,创建Result的方法,参数只要一个,那就是data,code直接为200,message为操作成功就行。于是我们定义一个succ的重载方法,能让我们更方便的使用结果封装:
在这里插入图片描述
  对于大部分请求失败的情况也是一样,一般请求失败时,后端都不会向前端返回data,请求失败时异常的报错信息message才是前端需要的,code也可以直接定义为400,因为400代表http中的bad request,即请求失败。于是我们定义一个fail的重载方法:
在这里插入图片描述
  此时,统一结果封装类我们就定义完成了,它的完整代码如下:

@Data
public class Result implements Serializable {
   

    private int code;
    private String msg;
    private Object data;

    public static Result succ(Object data) {
   
        return succ(200, "操作成功", data);
    }

    public static Result fail(String msg) {
   
        return fail(400, msg, null);
    }

    public static Result succ (int code, String msg, Object data) {
   
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.set
### 关于使用Spring BootVue实现前后端分离的权限管理系统 #### 构建环境准备 为了构建基于Spring BootVue.js的权限管理系统,需先准备好开发环境。确保安装了Java Development Kit (JDK),Node.js以及npm工具。对于前端部分,推荐利用Vue CLI创建新项目[^3]。 #### 后端服务配置-Spring Boot集成Security模块 在后端方面,采用Spring Security框架来处理认证与授权逻辑。这涉及到自定义UserDetailsService接口以加载用户特定的安全凭证数据;同时设置HttpSecurity规则用于保护API路径免受未授权访问的影响[^1]。 ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/public/**").permitAll() // 公开资源无需登录即可访问 .anyRequest().authenticated(); // 所有其他请求都需要身份验证 http.addFilterBefore(new JwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class); } } ``` #### 前端页面设计-Vue Router配合Vuex状态管理模式 针对前端而言,则依赖vue-router组件来进行路由控制,并借助vuex存储全局共享的状态信息如当前用户的权限级别等属性。当用户尝试进入某一路由时会触发导航守卫函数,在此期间可以检查是否有足够的权限去查看目标视图并作出相应跳转操作[^2]。 ```javascript // router/index.js import store from '@/store' const routes = [ { path: '/login', component: Login }, { path: '/', name: 'Home', meta: { requiresAuth: true }, // 设置该路由需要鉴权才能访问 children:[ ... ] } ] router.beforeEach((to, from, next) => { const isAuthenticated = store.getters.isAuthenticated; if(to.matched.some(record => record.meta.requiresAuth)){ !isAuthenticated ? next('/login') : next(); }else{ next(); } }) ``` #### API交互-Axios封装HTTP客户端发送请求携带token 为了让每次AJAX调用都能自动附带JWT令牌以便服务器识别合法的身份,可以在axios实例上挂载拦截器完成这一功能。这样做的好处在于一处修改全盘生效,减少了重复编码的工作量同时也提高了安全性。 ```javascript // utils/request.js import axios from "axios"; import store from "@/store"; let instance = axios.create({ baseURL: process.env.VUE_APP_BASE_API, }); instance.interceptors.request.use( config => { let token = store.state.user.token; if(token){ config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); export default instance; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

happy19991001

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

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

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

打赏作者

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

抵扣说明:

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

余额充值