Spring Boot拦截器:精细化控制请求与响应

简介: 本篇详细介绍了在Spring Boot中使用拦截器的方法。拦截器是一种强大的机制,可用于在请求处理前后进行操作,如鉴权、日志记录等。文章涵盖了创建拦截器类、注册拦截器以及实际应用案例。通过具体的代码示例,读者可以了解如何在项目中配置和使用拦截器,以实现各种功能需求。拦截器为Spring Boot应用增加了更多的灵活性和可扩展性,能够提升应用的安全性和可维护性。

概述

拦截器是Spring Boot中用于在请求进入控制器方法或响应返回前执行一些操作的机制。本篇技术长博文将详细介绍Spring Boot中拦截器的使用,包括自定义拦截器、拦截器的执行顺序、应用场景等,并通过实际的代码示例帮助读者掌握如何在项目中使用拦截器来实现精细化的请求与响应控制。

1. 拦截器简介

1、拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
2、权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
3、性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。

2. 拦截器三种方法

在Spring Boot中,实现拦截器有三种常用的方法:

方法一:实现HandlerInterceptor接口

这是一种常见的拦截器实现方式,需要创建一个类并实现HandlerInterceptor接口,然后重写其中的方法。以下是一个简单示例:

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
        // 在请求处理之前执行的逻辑
        return true; // 返回true继续执行,返回false中断执行
    }
}

方法二:继承HandlerInterceptorAdapter类

HandlerInterceptorAdapterHandlerInterceptor接口的适配器类,通过继承它可以实现拦截器。以下是一个示例:

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor extends HandlerInterceptorAdapter {
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
        // 在请求处理之前执行的逻辑
        return true; // 返回true继续执行,返回false中断执行
    }
}

方法三:使用@Component注解

通过将拦截器类标记为@Component注解,使其成为Spring容器的组件,实现拦截器的注册。这种方式不需要手动配置拦截器的注册,Spring Boot会自动识别并使用它。以下是一个示例:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
        // 在请求处理之前执行的逻辑
        return true; // 返回true继续执行,返回false中断执行
    }
}

这三种方法都能实现拦截器的功能,开发者可以根据实际需求选择适合自己项目的方法。拦截器在处理请求过程中具有重要作用,可以用于鉴权、日志记录、数据预处理等,从而提升应用的安全性和可维护性。

4. 使用HandlerInterceptor接口定义

方法名 描述
preHandle 在请求处理之前执行,允许您在请求被传递给控制器之前进行一些预处理操作,比如鉴权、日志记录等。如果返回true,则继续执行请求处理链;如果返回false,则中断请求处理。
postHandle 在请求处理之后、视图渲染之前执行。您可以在这里对模型和视图进行操作,但不能改变视图。通常用于修改响应内容、添加额外的模型数据等。
afterCompletion 在整个请求完成后执行,包括视图渲染。可以用于清理资源、记录请求处理时间等操作。

1、Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能
2、HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作
image.png

5. 自定义拦截器

首先,创建一个自定义的拦截器类,实现HandlerInterceptor接口,并重写其中的方法。

package com.example.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
   
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
       System.out.println("LoginInterceptor");
       return true;
  }
}

6. 配置拦截器

WebMvcConfigurer的实现类中配置拦截器。

1、addPathPatterns方法定义拦截的地址
2、excludePathPatterns定义排除某些地址不被拦截
3、添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求
4、如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。

package com.example.config;

import com.example.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
   

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
   
       registry.addInterceptor( new LoginInterceptor()).addPathPatterns("/user/**");
  }
}

7. 应用场景

拦截器适用于许多场景,如身份验证、日志记录、性能监控等。例如,可以通过拦截器在请求前检查用户是否已登录,或者在请求后记录请求的信息以及响应时间。

8. 测试

创建Spring Boot项目并运行,访问拦截路径,观察拦截器的执行情况。

总结

本文详细介绍了Spring Boot拦截器的使用,通过创建自定义拦截器、配置拦截器执行顺序以及应用场景的说明,读者可以了解如何在项目中使用拦截器实现对请求与响应的精细化控制。通过学习这些内容,你可以有效地使用拦截器来实现一系列需求,提升项目的可维护性和性能。

相关文章
|
2月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
2月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
2月前
|
XML JSON Java
【SpringBoot(三)】从请求到响应再到视图解析与模板引擎,本文带你领悟SpringBoot请求接收全流程!
Springboot专栏第三章,从请求的接收到视图解析,再到thymeleaf模板引擎的使用! 本文带你领悟SpringBoot请求接收到渲染的使用全流程!
200 3
|
5月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
411 0
|
存储 人工智能 Java
【图文详解】基于Spring AI的旅游大师应用开发、多轮对话、文件持久化、拦截器实现
【图文详解】基于Spring AI的旅游大师应用开发、多轮对话、文件持久化、拦截器实现
821 0
|
5月前
|
人工智能 安全 Java
Spring Boot 过滤器 拦截器 监听器
本文介绍了Spring Boot中的过滤器、拦截器和监听器的实现与应用。通过Filter接口和FilterRegistrationBean类,开发者可实现对请求和响应的数据过滤;使用HandlerInterceptor接口,可在控制器方法执行前后进行处理;利用各种监听器接口(如ServletRequestListener、HttpSessionListener等),可监听Web应用中的事件并作出响应。文章还提供了多个代码示例,帮助读者理解如何创建和配置这些组件,适用于构建更高效、安全和可控的Spring Boot应用程序。
617 0
|
8月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
772 5
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。