概述
拦截器是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类
HandlerInterceptorAdapter
是HandlerInterceptor
接口的适配器类,通过继承它可以实现拦截器。以下是一个示例:
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三种方法,通过重写这三种方法实现请求前、请求后等操作
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拦截器的使用,通过创建自定义拦截器、配置拦截器执行顺序以及应用场景的说明,读者可以了解如何在项目中使用拦截器实现对请求与响应的精细化控制。通过学习这些内容,你可以有效地使用拦截器来实现一系列需求,提升项目的可维护性和性能。