拦截器和过滤器详解

在 Java Web 开发中,拦截器(Interceptor)和过滤器(Filter)是两种常见的请求处理机制,它们用于对请求和响应进行预处理和后处理

1. 过滤器(Filter)

1.1 作用

Filter 主要用于对 请求(request)响应(response) 进行预处理和后处理,通常用于请求日志记录、编码设置、安全检查等场景

1.2 工作原理

  • Filter 作用于 Servlet 之前,对请求进行预处理
  • 处理完请求后,Filter 也可以对响应进行后处理
  • 通过 FilterChain 将请求传递给下一个 Filter 或 Servlet

1.3 实现步骤

  1. 实现 javax.servlet.Filter 接口
  2. 重写 doFilter 方法
  3. web.xml 中进行配置,或者使用 @WebFilter 注解

1.4 示例代码

java 复制代码
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*") // 作用于所有请求
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Filter: 请求被拦截");
        chain.doFilter(request, response); // 继续请求
        System.out.println("Filter: 响应被拦截");
    }
}

2. 拦截器(Interceptor)

2.1 作用

Interceptor 主要用于 拦截控制器(Controller)的执行 ,在方法执行前后视图渲染前执行特定逻辑,如权限控制、日志记录、事务管理等

2.2 工作原理

  • Interceptor 依赖 Spring MVC ,拦截的是 Controller 的执行过程
  • 可以在**方法调用前(preHandle)、方法调用后(postHandle)、视图渲染后(afterCompletion)**执行逻辑

2.3 实现步骤

  1. 实现 HandlerInterceptor 接口
  2. 重写 preHandlepostHandleafterCompletion 方法
  3. 在 Spring 配置中注册拦截器

2.4 示例代码

java 复制代码
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 {
        System.out.println("Interceptor: 进入 Controller 前");
        return true; // 继续执行 Controller 方法
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor: 方法执行完毕");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor: 视图渲染完成");
    }
}

2.5 拦截器的注册

java 复制代码
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 InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

3. 过滤器与拦截器的对比

比较项 过滤器(Filter) 拦截器(Interceptor)
作用范围 作用于 所有请求(包括静态资源) 作用于 Spring MVC 控制器
依赖 Servlet 规范 Spring MVC
触发时机 Servlet 之前 处理请求 Controller 执行前后 处理请求
适用场景 编码设置、日志记录、权限控制 认证授权、日志、事务处理
处理方式 doFilter 方法 preHandlepostHandleafterCompletion

4. 总结

  1. Filter 适用于所有请求 ,包括静态资源,可以用于通用的请求预处理和后处理
  2. Interceptor 仅拦截 Controller 方法 ,适用于控制器层面的拦截,如权限控制、事务管理
  3. 在 Spring Boot 应用中,一般推荐使用 Interceptor 来拦截业务逻辑,而使用 Filter 处理通用的请求逻辑
相关推荐
添砖Java中几秒前
深入剖析缓存与数据库一致性:Java技术视角下的解决方案与实践
java·数据库·spring boot·spring·缓存·双写一致性
m0_726965985 分钟前
在IDEA中导入gitee项目
java·gitee·intellij-idea
互联网动态分析7 分钟前
Java:编程世界的常青树与数字化转型的基石
java
浩~~12 分钟前
HTML5 中实现盒子水平垂直居中的方法
java·服务器·前端
mtc8n2420 分钟前
FastExcel 本地开发和Linux上上传Resource文件的差异性
java
天上掉下来个程小白21 分钟前
添加购物车-02.代码开发
java·服务器·前端·后端·spring·微信小程序·苍穹外卖
User_芊芊君子1 小时前
【Java继承】——面向对象编程的基石
java·开发语言
胡斌附体1 小时前
idea查看pom文件依赖
java·ide·intellij-idea·maven依赖
PgSheep1 小时前
一文通俗讲解MySQL数据库常见面试题-持续更新
java·数据库·mysql·面试
幽络源小助理1 小时前
懒人美食帮SpringBoot订餐系统开发实现
java·spring boot·后端·美食