SpringBoot 统一功能处理

1. 拦截器

1.1 拦截器快速入门

拦截器用于拦截用户请求,执行在目标方法前后,执行了一段代码

拦截器使用:

  • 定义拦截器
  • 注册并配置拦截器

自定义拦截器,实现HandlerInterceptor接口,并重写所有方法

复制代码
//拦截器
@Slf4j
public class LoginInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("目标方法执行前执行");
        //true=>放行  false=>拦截
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("目标方法执行后执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("页面渲染后执行");
    }
}

配置拦截器,实现WebMvcConfigurer 接口 ,并重写addInterceptors方法

复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;//注入上面设置的拦截器


//重写方法
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginInterceptor)
            .addPathPatterns("/**")
            .excludePathPatterns("/static/css/**", "/static/js/**", "/static/pic/**", "/user/login");
}
复制代码
}

1.2 拦截器详解

1.2.1 拦截路径

  • /**:匹配所有路径
  • /admin/*:匹配/admin下的单级路径
  • /admin/**:匹配/admin下的多级路径

1.2.2 拦截器执行流程

客户端请求

↓

preHandle()方法

↓ 返回true

处理器方法执行

↓

postHandle()方法

↓

视图渲染

↓

afterCompletion()方法

2. 统一数据返回格式

创建统一响应体类:

复制代码
package com.example.springbookdemo.entity;

import com.example.springbookdemo.enums.ResultCodeEnum;
import lombok.Data;

@Data
public class Result<T> {
    private int code;//-1=>未登录   -2=>参数错误  200=>正常 -100=>异常
    private String message;
    private T data;

    public static <T> Result<T> unLogin(){
        Result<T> result=new Result<T>();
        result.setCode(ResultCodeEnum.UNLOGIN.getCode());
        result.setMessage(ResultCodeEnum.UNLOGIN.getMessage());
        return result;
    }

    public static <T> Result<T> success(T data){
        Result<T> result=new Result<T>();
        result.setCode(ResultCodeEnum.SUCCESS.getCode());
        result.setMessage("");
        result.setData(data);
        return result;
    }

    public static <T> Result<T> pararmError (){
        Result<T> result=new Result<T>();
        result.setCode(ResultCodeEnum.PARARM_ERROR.getCode());
        result.setMessage(ResultCodeEnum.PARARM_ERROR.getMessage());
        return result;
    }

    public static <T> Result<T> pararmError (String message){
        Result<T> result=new Result<T>();
        result.setCode(ResultCodeEnum.PARARM_ERROR.getCode());
        result.setMessage(message);
        return result;
    }

    public static <T> Result<T> Fail (String message){
        Result<T> result=new Result<T>();
        result.setCode(ResultCodeEnum.FAIL.getCode());
        result.setMessage(message);
        return result;
    }
}

编写一个类实现ResponseBodyAdvice接口,并重写两个方法,添加 @ControllerAdvice

复制代码
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        //该方法用于判断是否对结果进行处理
        //true为处理,false为不处理
        return true;
    }


    @Autowired
    ObjectMapper objectMapper;//便于后续对String转JSon操作
    @SneakyThrows//相当于使用try/catch

//上一个方法返回true则执行该方法
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        //该方法用于处理结果
        //参数中的body代表结果
        if(body instanceof Result){
            return body;
        }
        //统一结果返回,需要额外对String类型进行处理
        if(body instanceof String){
            return objectMapper.writeValueAsString(Result.success(body));
            //返回JSON
        }
        return Result.success(body);
    }
}

3. 统一异常处理

用@ControllerAdvice+@ExceptionHandler实现

复制代码
//统一异常处理
@ControllerAdvice
@ResponseBody
public class ErrorAdvice {
    @ExceptionHandler
    public Object handler(Exception e){
        return Result.Fail(e.getMessage());
    }
}
相关推荐
Wang's Blog6 小时前
Java框架 SpringCloud 快速入门: 全局过滤器(GlobalFilter)自定义鉴权
java·开发语言·spring cloud
溪语流沙6 小时前
【Web全栈进阶】PostgreSQL上手:Docker跑库 + 把早报站从SQLite迁过去
前端·docker·postgresql
IT_陈寒6 小时前
SpringBoot自动配置的坑:你以为的捷径可能是弯路
前端·人工智能·后端
paopaokaka_luck6 小时前
高校社团管理(AI辅助任务分配、协同过滤算法推荐、ECharts数据可视化、活动参与闭环、校园交流与反馈、器材借还管理)
java·前端·javascript·spring boot·数据分析·echarts
vx_Biye_Design6 小时前
springboot小区管理系统68491-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
专业程序开发源7 小时前
springboot外卖系统94294-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Dovis(誓平步青云)7 小时前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物
FYKJ_20107 小时前
springboot心理健康管理系统86254-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·mysql·django·课程设计
Moshow郑锴9 小时前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
Wang's Blog16 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx