Spring boot3系列5:拦截器(Interceptor)
李明明架构师Spring Boot 3系列第5课: 拦截器(interceptor)
Spring Boot Interceptor是一个附加组件,它将拦截每个请求和响应调度并对其执行一些操作。
Web应用程序中的拦截器在执行前或者执行后两个地方发挥着作用。
拦截器有一个主要的目的:拦截传入或者传出的请求
执行此拦截行为是为了在操作调用之前或者之后执行某些操作。您可以将拦截器视为请求与应答之间的中介。Spring Boot中的Interceptor可以通过扩展HandlerInterceptorAdapter类或者实现handlerInterceptor接口来实现 。
拦截器可用于许多领域,列举一些:
1.日志记录
日志记录是为了解代码和调试流程的常见做法。拦截器广泛用于相同的目的,记录或记录客户端发出的请求或发回给他们的响应通常可用于调试和监视目的。
2.身份验证
身份验证是一种安全机制,歌剧 请求到达其相应控制器之前在拦截器内部实现。它可以被拦截器拦截,并且验证身份,如果被拒绝,则请求不会被委托给控制器,这不仅是最大限度地减少了代码,而且减少了巨大的开销。
3. Request/Response修改
拦截器还用于修改Reqeust/Response。可以通过以下方式完成:
3.1 添加或者修改请求参数
3.2修改请求头或者响应头
3.3更改状态代码
3.4重定向到其他URL
3.5处理自定义错误Reqeuxt/Response,从而释放控制器或添加外部组件以处理异常
局限性
性能开销:如果我们的应用程序处理大量拦截器,那么管理每个拦截器不仅很复杂,而且会导致性能下降。
与全局状态断开连接:拦截器不存储任何应用程序的状态,例如当前更新的数据和位置。拦截器的实现方式必须使其拦截不会影响我们应用程序的其他部分,并且应该只影响拦截请求。
安全性:当拦截器记录请求和响应数据时,它必须以保护方式这样做,否则它会将请求的数据暴露给攻击者。
优势:
1.可重用性:我们在应用程序中实现的拦截器可以来回重用,以处理对多个请求的请求和响应。它们还帮助我们最小化控制器中的代码,将身份验证和修改逻辑从控制器转移到拦截器。
2.日志记录和监控:拦截器帮助我们记录、调试和监控传入和传出的请求。这样可以节省时间,来回了解请求的状态。
3.安全和身份验证:拦截器可以验证所发出的请求,并根据验证进行委派
4.简单配置:拦截器可以吗很容易地配置,而不会影响整个应用程序,因为拦截器的主要目的只是拦截请求和响应。
现在跟着我一步一步开发一个拦截器:
创建Spring boot 3项目 ,可以看我之前的博客:
https://botongcode.com/note/1713015843406 此项目开源在github中,地址: https://github.com/nocoolming/springboot3example 项目中Jdk版本:21 Spring boot版本:3.2.4 接下来,我们新一个过滤器(Interceptor)@Component
public class DemoInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(DemoInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//* Business logic just when the request is received and intercepted by this interceptor before reaching the controller
try {
log.info("1 - preHandle() : Before sending request to the Controller");
log.info("Method Type: " + request.getMethod());
log.info("Request URL: " + request.getRequestURI());
}
//* If the Exception is caught, this method will return false
catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
// Response is intercepted by this method before reaching the client
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//* Business logic just before the response reaches the client and the request is served
try {
log.info("2 - postHandle() : After the Controller serves the request (before returning back response to the client)");
}
catch (Exception e) {
e.printStackTrace();
}
}
// This method is called after request & response HTTP communication is done.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//* Business logic after request and response is Completed
try {
log.info("3 - afterCompletion() : After the request and Response is completed");
}
catch (Exception e) {
e.printStackTrace();
}
}
}
@Configuration
public class SiteConfig implements WebMvcConfigurer {
@Autowired
DemoInterceptor demoInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor)
.addPathPatterns("/**");
}
}
我们现在新增一个MessageController
@RestController
public class MessageController {
private static final Logger log = LoggerFactory.getLogger(MessageController.class);
@PostMapping("message/create")
Map<String, String> post(@RequestBody Map<String, String> map){
log.info("message/create");
return map;
}
}
接下来我们Postman中执行一下post请求。
==============================
OK,大家有什么不懂的可以加QQ群讨论。
也可以直接在评论区交流
看到会回复。
Q群:559722761
微信群:
抖音|B站|小红书:李明明-架构师