Spring Boot统一功能处理(拦截器, 统一数据返回格式, 统一异常处理)

简介: Spring Boot统一功能处理(拦截器, 统一数据返回格式, 统一异常处理)

Spring Boot 中的几种统一功能处理方式 (共性下沉, 个性提取)

  1. 拦截器
  2. 统一数据返回格式
  3. 统一异常处理

拦截器

Spring MVC 中的一个组件, 用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码

拦截器的使用步骤

  1. 定义拦截器
  2. 注册配置拦截器

定义拦截器

实现 HandlerInterceptor 接口, 并重写其所有方法

preHandler() 方法 : 在目标方法执行前执行 , 返回值 true 表示允许继续执行目标方法, 返回值 false 表示中断目标方法的执行

postHandler() 方法 : 目标方法执行后执行


afterCompletion() 方法 : 视图渲染完成后, 执行该方法内容

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("LoginInterceptor 目标方法执行前, 执行代码 ...");
        return true; // 默认全部放行
    }

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

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("LoginInterceptor 视图渲染完成后, 执行代码 ...");
    }
}

注册配置拦截器

实现 WebMvcConfigurer 接口, 并重写 addInterceptors 方法


@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 获取拦截器对象
    @Autowired
    private LoginInterceptor loginInterceptor;

    private List<String> excludePath = Arrays.asList(
            "user/login",
            "/**/**.html",
            "/css/**",
            "/js/**",
            "/img/**"
    );
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自定义拦截对象
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")  // 设置拦截器的拦截路径
                .excludePathPatterns("/login.html") // 设置拦截器的放行路径
                .excludePathPatterns(excludePath);
    }
}


常见拦截路径的设置 :

/* : 一级路径

/** : 任意级路径

/book/* : /book 下的一级路径

/book/** : /book 下的任意级路径

添加拦截器之后的执行流程

  1. 添加拦截器后, 在执行每个方法之前, 都会先进行判定是否在拦截路径 / 放行路径中, 并判定是否执行拦截器内容
  2. 被拦截住的请求, 会先执行 preHandler() 方法, 该方法返回一个布尔值. 返回 true 代表该方法被放行, 返回 false 表示该方法不会被放行(即不会执行)
  3. 请求执行完毕后, 再执行 postHandler() 方法
  4. 待视图渲染完成后, 再执行afterComletion() 方法

统一数据返回格式

统一数据返回格式使用 @ControllerAdvice 和 实现 ResponseBodyAdvice 接口的方式实现

@ControllerAdvice : 表示该类为 控制器通知类

ResponseBodyAdvice 接口 : 内含 supports 方法beforeBodyWrite 方法

  • supports : 判断是否执行 beforeBodyWtire 方法, 返回值为 true 为执行, false 为不执行.
  • ResponseBodyWrite : 对 response 方法进行具体操作处理

统一数据返回格式优点

  1. 方便前端程序员接收和解析后端数据接口返回的数据
  1. 方便后端部门的统一规范的标准执行
  2. 有利于项目统一数据的维护和修改

首先得有一个数据返回格式

@Data
public class Result<T> {
    private int status;
    private String err = "";
    private T data;

    //成功
    public static <T>Result<T> success(T data) {
        Result<T> result = new Result<T>();
        result.setStatus(200);
        result.setData(data);
        return result;
    }

    // 失败
    public static <T>Result<T> fail(T data, String err) {
        Result<T> result = new Result<T>();
        result.setStatus(-1);
        result.setErr(err);
        result.setData(data);
        return result;
    }
    public static <T>Result<T> fail(String err) {
        Result<T> result = new Result<T>();
        result.setStatus(-1);
        result.setErr(err);
        return result;
    }

    // 未登录
    public static <T>Result<T> unlogin() {
        Result<T> result = new Result<T>();
        result.setStatus(-2);
        result.setErr("用户未登录");
        return result;
    }
}

统一数据格式 具体执行代码

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 表示对哪些请求执行 统一数据返回格式处理 (这里就简单的全部执行)
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if(body instanceof Result) {
            return body;
        }
        if(body instanceof String) {
            // 需要对 String 类型的 body 进行序列化处理 (使用 Spring Boot 内置的 Jackson 工具)
            return objectMapper.writeValueAsString(Result.success(body));
        }
        return Result.success(body);
    }
}

统一异常处理

统一异常处理使用 @ControllerAdvice@ExceptionHandler 注解实现

@ControllerAdvice : 表示控制器通知类

@ExceptionHandler : 表示异常处理器

两个注解搭配使用, 表示当出现某个异常的时候, 执行对应的方法事件

@ResponseBody
@ControllerAdvice
public class ErrorAdvice {
    @ExceptionHandler
    public Result handler(Exception e) {
        return Result.fail(e.getMessage());
    }

    @ExceptionHandler
    public Result handler(NullPointerException e) {
        return Result.fail("发生空指针异常: " + e.getMessage());
    }

    @ExceptionHandler
    public Result handler(ArithmeticException e) {
        return Result.fail("发生算数异常:" + e.getMessage());
    }
}

目录
相关文章
|
1月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
2759 41
|
1月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
1月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
335 2
|
4月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
399 1
|
4月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
515 3
|
存储 人工智能 Java
【图文详解】基于Spring AI的旅游大师应用开发、多轮对话、文件持久化、拦截器实现
【图文详解】基于Spring AI的旅游大师应用开发、多轮对话、文件持久化、拦截器实现
772 0
|
4月前
|
人工智能 安全 Java
Spring Boot 过滤器 拦截器 监听器
本文介绍了Spring Boot中的过滤器、拦截器和监听器的实现与应用。通过Filter接口和FilterRegistrationBean类,开发者可实现对请求和响应的数据过滤;使用HandlerInterceptor接口,可在控制器方法执行前后进行处理;利用各种监听器接口(如ServletRequestListener、HttpSessionListener等),可监听Web应用中的事件并作出响应。文章还提供了多个代码示例,帮助读者理解如何创建和配置这些组件,适用于构建更高效、安全和可控的Spring Boot应用程序。
612 0
|
6月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。

热门文章

最新文章