Java 过滤器和拦截器

过滤器 (Filter)

过滤器是 Java EE 规范中的组件,位于 Servlet 容器中,用于在请求到达 Servlet 之前或响应返回客户端之前进行预处理和后处理。

主要特点:

  • 基于函数回调
  • 实现 javax.servlet.Filter 接口
  • 通过 web.xml 或 @WebFilter 注解配置
  • 可以修改请求和响应对象
  • 不能直接访问 Spring 上下文

实现示例:

@WebFilter("/*")
public class MyFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代码
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        // 预处理
        System.out.println("Before Servlet");
        
        // 继续执行链
        chain.doFilter(request, response);
        
        // 后处理
        System.out.println("After Servlet");
    }

    @Override
    public void destroy() {
        // 清理代码
    }
}


拦截器 (Interceptor)

拦截器是 Spring 框架提供的组件,基于 AOP (面向切面编程) 思想实现,主要用于 Spring MVC 应用中。

主要特点:

  • 基于 AOP 代理
  • 实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter
  • 通过 WebMvcConfigurer 配置
  • 可以访问 Spring 上下文
  • 更细粒度的控制(可以指定拦截哪些方法)

实现示例:

public class MyInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
            throws Exception {
        // 在控制器方法执行前调用
        System.out.println("Pre-handle");
        return true; // 返回false则中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
            ModelAndView modelAndView) throws Exception {
        // 在控制器方法执行后,视图渲染前调用
        System.out.println("Post-handle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, 
            Exception ex) throws Exception {
        // 在请求完成后调用(视图渲染后)
        System.out.println("After completion");
    }
}


注册拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}


主要区别

特性过滤器 (Filter)拦截器 (Interceptor)
所属规范Java EESpring
依赖Servlet 容器Spring 容器
粒度较粗(URL 级别)较细(方法级别)
AOP 支持不支持支持
Spring 上下文访问不能
执行时机在 Servlet 前后在控制器方法前后
配置方式web.xml 或 @WebFilterJava 配置或 @Bean

使用场景

使用过滤器:

  • 日志记录
  • 编码设置
  • 跨域处理 (CORS)
  • XSS 防护
  • 权限验证(简单场景)

使用拦截器:

  • 权限验证(需要访问 Spring 上下文)
  • 日志记录(需要记录控制器信息)
  • 性能监控
  • 业务逻辑处理

在实际开发中,简单的预处理可以使用过滤器,而需要与 Spring 上下文交互或更细粒度控制时,应使用拦截器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值