过滤器和拦截器的区别

学习完springmvc之后,初步了解了拦截器和过滤器,那么他们之间有什么区别呢,具体代码怎么实现?

过滤器和拦截器有什么区别

过滤器(Filter):是 Servlet 规范里的,属于Servlet容器层面(像 Tomcat),在请求到达 Servlet 之前或响应返回浏览器之前,做一些预处理或后处理。比如:统一编码处理、权限检查、日志记录、静态资源处理。

拦截器(Interceptor):是 Spring 里的,属于Spring MVC框架层面,作用在 Controller 方法调用前后,可以拿到 Spring 的各种功能,比如依赖注入、上下文管理,适配性更强。

比较点过滤器(Filter)拦截器(Interceptor)
属于哪层Servlet规范Spring框架
作用对象Servlet、静态资源Controller方法(Handler)
生命周期由服务器(Tomcat等)管理由Spring容器管理
技术标准Java EE标准Spring MVC扩展
功能扩展性不能用Spring注入Bean可以直接用@Autowired等

可以理解为:

Filter:大门口的安检,任何人进出都要过一遍。

Interceptor:楼层电梯口的守卫,只拦截要去特定楼层的人(控制器方法)。

Filter 示例(过滤器)

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*") // 过滤所有请求
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] 响应回来了,做点收尾工作...");
    }
}
  • 这个@WebFilter需要在启动类加上@ServletComponentScan注解才能生效哦。

  • 不加的话,需要自己注册 Filter Bean。

Interceptor 示例(拦截器)

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("[Interceptor] Controller方法调用前,检查权限...");
        return true; // 返回false就直接拦截,不继续走Controller了
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           org.springframework.web.servlet.ModelAndView modelAndView) throws Exception {
        System.out.println("[Interceptor] Controller方法调用后,修改返回数据...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("[Interceptor] 整个请求完成后,资源清理...");
    }
}

然后要把拦截器注册到 Spring MVC:

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 MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**"); // 拦截所有路径
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值