学习完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("/**"); // 拦截所有路径
}
}