Spring boot 拦截器
前言
在Spring Boot中,拦截器(Interceptor)是一种用于在请求被处理之前和之后执行特定逻辑的强大工具。它们通常用于执行诸如日志记录、身份验证、授权、性能监控等任务。
在Spring Boot应用中,拦截器可以通过实现HandlerInterceptor
接口或扩展HandlerInterceptorAdapter
类来创建。以下是使用Spring Boot拦截器的基本步骤:
1. 创建拦截器
通过实现HandlerInterceptor
接口或扩展HandlerInterceptorAdapter
类,定义你的拦截器。你需要至少覆盖以下三个方法中的一个或多个:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
: 在请求处理之前调用。如果返回false
,则请求将被拒绝,不会继续执行后续的拦截器和控制器方法。postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
: 在请求处理之后,但在视图渲染之前调用。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
: 在整个请求处理完成后调用,即视图渲染之后。
示例:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在这里执行你的逻辑,例如记录日志或检查权限
// 如果返回false,请求将被拒绝
return true;
}
// 可以选择性地覆盖postHandle和afterCompletion方法
}
2. 注册拦截器
在Spring Boot中,你需要将拦截器注册到WebMvcConfigurer
的addInterceptors
方法中。你可以通过实现WebMvcConfigurer
接口或扩展WebMvcConfigurerAdapter
(如果你使用的是较旧的Spring Boot版本)来完成这一步骤。
示例:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/error", "/static/**", "/css/**", "/js/**", "/images/**"); // 排除某些路径
}
}
在上面的示例中,addPathPatterns
方法指定了哪些路径应该被拦截,而excludePathPatterns
方法则指定了哪些路径应该被排除在拦截之外。
3. 测试拦截器
启动你的Spring Boot应用,并发送请求以测试拦截器是否按预期工作。你可以通过查看日志输出、检查响应内容或使用调试工具来验证拦截器的行为。
4. postHandle 和 afterCompletion 的区别
在Spring Boot中,拦截器(Interceptor)是Spring MVC框架中的一个重要组件,它用于在请求处理过程中执行特定的逻辑。拦截器通常实现HandlerInterceptor
接口,该接口定义了三个方法:preHandle
、postHandle
和afterCompletion
。下面我将详细解释postHandle
和afterCompletion
方法的触发时机:
- postHandle方法:
-
函数声明:
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception;
-
说明:
- 此方法在控制器处理请求方法调用之后,在解析视图之前执行。
- 可以通过此方法对请求域中的模型和视图做进一步修改。
- 如果
preHandle
方法返回false
,则此方法不会被执行。
-
参数:
HttpServletRequest request
:当前的HTTP请求。HttpServletResponse response
:当前的HTTP响应。Object handler
:被调用的处理器(通常是HandlerMethod
或HandlerAdapter
的实例)。@Nullable ModelAndView modelAndView
:控制器返回的ModelAndView
对象(如果有的话),可以为null
。
-
触发时机:在控制器方法成功执行后,但在视图渲染之前。也就是说,当请求被控制器处理完毕并返回ModelAndView对象(或者相应的响应)时,
postHandle
方法会被触发。 -
作用:这个方法可以对控制器方法返回的ModelAndView对象进行后处理,例如添加额外的模型属性或修改响应内容。
-
细节:如果
preHandle
方法返回false
,则postHandle
方法将不会被调用,因为请求已经被拦截器阻止,没有进入控制器方法。
- afterCompletion方法:
- 函数声明:
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception;
- 说明:
- 此方法在视图渲染完成之后执行,通常用于资源清理、记录日志信息等工作。
- 此方法只有在
preHandle
方法被成功执行并返回true
时才会被执行。
- 参数:
HttpServletRequest request
:当前的HTTP请求。HttpServletResponse response
:当前的HTTP响应。Object handler
:被调用的处理器(与postHandle
相同)。@Nullable Exception ex
:在请求处理过程中出现的异常(如果有的话),可以为null
。
- 触发时机:在整个请求处理完成之后,包括控制器方法的执行和视图的渲染。具体来说,当DispatcherServlet处理完请求并返回给客户端后,
afterCompletion
方法会被触发。 - 作用:这个方法通常用于清理资源、记录日志或执行一些需要在请求结束后执行的逻辑。
- 细节:即使
preHandle
方法返回false
导致请求没有进入控制器方法,afterCompletion
方法仍然会被调用(前提是该拦截器在preHandle
中返回了true
或者根本没有preHandle
方法)。但需要注意的是,如果在preHandle
中返回了false
,那么postHandle
方法将不会被调用,即使afterCompletion
会。
- 函数声明:
总结:
postHandle
在控制器方法执行之后、视图渲染之前被触发,用于对控制器方法的返回值进行后处理。afterCompletion
在整个请求处理完成之后被触发,包括控制器方法和视图渲染,用于执行一些需要在请求结束后执行的逻辑。
这两个方法提供了在请求处理过程中的不同阶段执行额外逻辑的能力,使得开发者能够更加灵活地控制请求的处理流程。
- 点赞
- 收藏
- 关注作者
评论(0)