看看我详细的视频,和订阅我的频道加入我们的大家庭吧!你的支持对我来说真的很重要!
在这段视频里,我们谈到了几个关键方面:
- 创建拦截器吗?
- 注册拦截器?
- 注册多个拦截器吗?
- 如何为特定URL模式注册拦截器呢?
Spring Boot 的拦截器是一种强大的工具,可以拦截应用中的 HTTP 请求和响应。
它们属于 Spring Web MVC 框架,在控制器处理请求之前和之后允许你执行操作。
创建拦截器
要创建一个拦截器,你需要实现 HandlerInterceptor
接口或继承 HandlerInterceptorAdapter
类。
包 com.javacodeex.interceprots;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
@Component
public 类 LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("请求 URL: " + request.getRequestURL());
log.info("请求 Method: " + request.getMethod());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 可在此处记录响应详细信息
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
// 可在此处记录处理完成详情
log.info("请求处理完成");
}
}
package com.javacodeex.interceprots;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
@Component
public class ProductInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("请求 URL: " + request.getRequestURL());
log.info("请求方法: " + request.getMethod());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 可在此处记录响应信息
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
// 可在此处记录完成信息
log.info("请求处理完成");
}
}
注册拦截器插件
package com.javacodeex.config;
import com.javacodeex.interceprots.LoggingInterceptor;
import com.javacodeex.interceprots.ProductInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoggingInterceptor loggingInterceptor;
@Autowired
private ProductInterceptor productInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loggingInterceptor)
.addPathPatterns("/api/**") // 拦截需要处理的 URL 模式
.excludePathPatterns("/api/auth/**"); // 排除需要拦截的 URL 模式
registry.addInterceptor(productInterceptor)
.addPathPatterns("/product/**") // 拦截需要处理的 URL 模式
.excludePathPatterns("/api/auth/**");
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
@Slf4j
public class CustomerController {
@GetMapping
public String getMessage(){
log.info("getMessage()");
return "欢迎来到拦截器会话";
}
}
package com.javacodeex.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/product")
@Slf4j
public class ProductController {
@GetMapping
public String getProduct(){
log.info("getProduct()");
return "product information";
}
}
Spring Boot拦截器的生命周期
- preHandle :在实际处理器被执行之前被调用。此方法可用于执行预处理任务(比如记录日志、身份验证等)。如果返回
false
,执行链将被中断,导致后续处理不被执行。 - postHandle :在处理器执行后但在
ModelAndView
渲染之前被调用。此方法可用于在ModelAndView
渲染之前对其进行修改。 - afterCompletion :在请求完全处理完毕后被调用。此方法可用于清理工作。
过滤器和拦截器都是处理Spring Boot应用中HTTP请求和响应的机制,但它们在不同的层级上工作并且有不同的目的。以下是它们的主要区别:
过滤生命周期和位置
- 过滤器属于Servlet API,并可以配置在web.xml文件中,或者在Spring Boot应用中通过注解配置。
- 过滤器应用于所有传入请求,并可用于执行如认证、日志记录和输入校验等任务。
执行位置:
- 过滤器在请求处理过程的前后都会被执行,包括在请求转发到 servlet 或控制器之前和之后。
范围
- 过滤器可以应用到所有或特定的 URL 模式上,并且它们在请求到达 servlet 或控制器之前,在最底层起作用。
设置 :
- 过滤器可以通过
@WebFilter
注解进行配置,或者作为 bean 注册到FilterRegistrationBean
。
应用场景:
- 常用于诸如安全、日志记录和输入输出过滤等横切关注点。
生命周期和位置:
- 拦截器(Interceptors)是Spring MVC框架的一部分,并通过Spring的配置类来配置。
- 拦截器用于在执行控制器中的方法之前和之后进行操作。
执行位置:
- 拦截器在请求生命周期中的关键点会被执行:在控制器方法调用前(
preHandle
),在控制器方法调用后但在视图渲染前(postHandle
),以及在请求处理完毕后(afterCompletion
)。
范围定义:
- 拦截器可以应用于所有或特定的 URL 模式,并可以按顺序链接。
- 它们在较高层级上运作,与控制器(处理器)和视图进行交互。
设置:
- 通过实现
HandlerInterceptor
接口,并在实现WebMvcConfigurer
接口的配置类中注册这些拦截器来配置拦截器的方式。
场景:
- 常用于执行如日志记录、安全验证、修改
ModelAndView
对象的等需要在请求生命周期中特定点的操作。
谢谢啦,继续加油哦!
Java代码谢谢读到最后,在你离开前:
- 请考虑拍手并支持作者哦!👏
- 来YouTube支持我们吧
跟着我,更多精彩等你来!
[点击这里关注我在Medium上的文章](https://medium.com/https://medium.com/@saijanand)