Spring Boot 中攔截器與過濾器的區別(通俗講解)
在使用Spring Boot时,你可能需要修改和处理HTTP请求和响应消息。两种常见的方法是过滤器和拦截器。虽然它们看起来相似,但它们有不同的功能,并在请求处理的不同阶段发挥作用。虽然“过滤器”和“拦截器”是正确的术语,但它们在请求处理的早期和后期阶段分别起作用,因此有不同的用途。
1. 什么是滤镜?一个 过滤器(Filter) 是 Servlet API 的一部分,它在 较低层 处理所有传入的请求,在这些请求到达 Spring的调度器之前。
要何时使用过滤器比较合适? 何时使用过滤器比较合适?(Note: Since the "#" symbol is typically not used in Chinese contexts unless for specific formatting, one could consider removing it entirely. However, keeping it preserves the header format from the source text. If strictly adhering to the expert suggestion, the "#" should be removed.)
Final decision on keeping or removing "#" symbol can be made based on the document's specific formatting needs. Considering the expert suggestion, the more natural version without "#" would be:
何时使用过滤器比较合适?
使用 过滤器 来对所有 HTTP请求 进行一般的请求/响应修改:
- 日志:记录请求和响应的详细信息以方便调试和监控。
- GZIP 压缩:减小响应体积以加快数据传输速度。
- 文本编码:确保正确的文本编码(如 UTF-8)以保持一致性。
- 安全检查:实施防火墙、流量限制和访问控制。
- 请求和响应的修改:修改 HTTP 数据(如封装、清理、缓存数据)。
@Component
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("收到请求:" + request.getRemoteAddr());
chain.doFilter(request, response);
System.out.println("响应发送。");
}
}
适用于所有类型的请求,包括静态资源:
无法直接访问 Spring 的 beans 或控制器。
一个拦截器是一个Spring MVC的一部分,并在Spring框架内部运行。它能够专门针对控制器的请求和响应进行修改。
一个拦截器何时使用?何时使用拦截器?
例如,当你需要在请求到达控制器之前执行 Spring 特定逻辑时,可以使用拦截器。
- 认证与授权:验证用户的凭证和权限,确保用户有权访问特定的控制器。
- 记录执行时间:测量并记录控制器处理请求所需的时间。
- 修改模型/视图:在向客户端发送响应前调整模型或视图。
- 添加通用属性:在所有响应中包含通用数据(例如用户详情)。
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("正在检查身份验证...");
return true; // 继续传递请求到下一个处理阶段
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("控制器已处理请求。");
}
}
仅限于Spring MVC控制器(不适用于静态文件或servlet)。
可以访问Spring Bean(比如,服务类、仓储)。
- 拦截器在请求到达Spring的DispatcherServlet之前运行,影响所有传入的HTTP请求。
- 拦截器在控制器中的方法执行前和后运行,仅在Spring MVC中起作用。
- 过滤器 在 Servlet API 层 运行,这意味着它们适用于 所有请求,包括静态资源(如 CSS、JS 和图片)。
- 拦截器 在 Spring MVC 中工作,仅影响 控制器特定的 请求。
- 过滤器 无法 直接访问 Spring 管理的 Bean,因为它们位于 Servlet 容器 内部。
- 拦截器 可以使用
@Autowired
注入 Spring Bean,因为它们在 Spring 容器中。
- 过滤器 会处理 所有 的 HTTP 请求,包括 API 端点、静态文件和 servlet。
- 拦截器 只针对 Spring MVC 控制器请求 起作用,并且不包括静态文件。
- 滤镜可以修改HTTP请求和响应的详细信息(例如,头部,编码,压缩,安全性)。
- 拦截程序无法直接修改请求或响应的内容,但可以在返回响应之前调整模型和视图。
在以下情况下使用过滤器:
- 你需要应用一些安全检查,比如防火墙和速率限制。
- 你正在修改原始的 HTTP 请求或响应,比如进行日志记录、压缩或编码。
- 你希望跟踪所有传入的流量,包括静态资源在内的所有内容。
当你需要使用拦截器时:
- 在访问Controller之前,你需要验证或授权用户身份。
- 你需要记录Controller方法的执行时间。
- 在响应发送之前,你需要修改Model或View。
你需要修改所有请求,包括静态文件(CSS、JS、图片)。
你需要在HTTP层面工作(比如安全和压缩)。
你不需要访问Spring beans。
你需要控制发送给控制器的请求。
你想要修改Spring的模型或视图。
你需要访问Spring管理的那些服务(例如,认证相关的服务)。
- 过滤器 = 在 Servlet 层工作的功能,拦截并处理所有请求(包括静态文件)。
- 拦截器 = 在 Spring MVC 层工作的功能,处理与控制器相关的处理。
经验规则:
- 如果你的任务涉及修改原始的 HTTP 请求内容(如头部、编码、压缩等)→ 使用过滤器(Filter)。
- 如果你需要在控制器执行前后添加逻辑 → 使用拦截器。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章