在Java Web开发中,过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)是三种不同的机制,它们分别用于处理不同类型的任务。
一、过滤器(Filter)
作用:主要用于对请求或响应进行预处理或后处理,比如权限验证、日志记录等。过滤器可以链式执行,一个请求可能经过多个过滤器。
生命周期方法:
- init(FilterConfig filterConfig):初始化过滤器。
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain):执行过滤逻辑。
- destroy():销毁过滤器时调用。
示例:
@WebFilter(filterName = "myFilter",urlPatterns = {"/hello/*"})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter 初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("执行过滤操作前...");
chain.doFilter(request, response);
System.out.println("执行过滤操作后...");
}
@Override
public void destroy() {
System.out.println("Filter 销毁");
}
}
@WebFilter 是 Servlet 3.0 引入的一个注解,用于简化过滤器的配置过程。通过这个注解,可以直接在过滤器类上声明其映射路径等信息,而无需在 web.xml 中进行配置。然而,为了@WebFilter 注解能够生效,特别是在使用 Spring Boot 的情况下,需要确保在项目启动类上配置 @ServletComponentScan 注解。
二、拦截器(Interceptor)
作用:通常用于Spring框架中,可以在控制器执行之前或之后进行拦截,常用于权限控制、日志记录等。
生命周期方法:
- preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在处理器执行之前被调用。
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在处理器执行之后,视图渲染之前被调用。
- afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在整个请求完成之后被调用,即视图渲染结束之后。
示例:
创建你的拦截器类:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("在请求处理之前进行调用...");
return true; // 如果返回false,则请求不会继续
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.println("在视图渲染之前进行调用...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("在整个请求结束之后被调用...");
}
}
在配置类中注册这个拦截器并定义其应用范围:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 应用拦截器到指定路径模式
.excludePathPatterns("/hello/**"); // 排除某些路径
}
//......
}
三、监听器(Listener)
作用:用于监听特定事件的发生,如ServletContext、HttpSession或ServletRequest的创建与销毁等,并对此做出相应的反应。
常见类型:
ServletContextListener:监听Web应用的启动和关闭。
HttpSessionListener:监听session的创建和销毁。
ServletRequestListener:监听request的创建和销毁。
示例代码(以ServletContextListener为例):
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Web 应用程序已启动");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Web 应用程序已关闭");
}
}
四、过滤器(Filter)和拦截器(Interceptor)的区别
在实际应用中,过滤器(Filter)和拦截器(Interceptor)虽然都能用于处理请求前后的一些逻辑,但它们在多个方面存在差异。了解这些差异有助于选择最适合的技术来解决问题。以下是过滤器与拦截器的主要区别:
1. 技术框架
过滤器(Filter):属于Servlet规范的一部分,是Java EE标准技术,可以在任何遵循Servlet规范的Web应用程序中使用。
拦截器(Interceptor):通常用于Spring框架中,特别是Spring MVC,它不是Java EE的标准部分,而是Spring提供的一个功能。
2. 拦截范围
过滤器:可以拦截所有进入Servlet容器的请求,包括静态资源(如HTML、CSS、JavaScript文件等),以及动态资源(如JSP、Servlet等)。
拦截器:主要针对Spring MVC框架中的控制器(Controller)进行拦截,不会直接作用于静态资源,除非特别配置。
3. 配置方式
过滤器:可以通过web.xml文件配置,或者在Servlet 3.0及以上版本中使用注解(@WebFilter)配置。
拦截器:需要在Spring配置类中通过实现WebMvcConfigurer接口,并重写addInterceptors()方法来注册拦截器。
4. 执行顺序
过滤器:执行顺序由<filter-mapping>在web.xml中的顺序决定,或基于注解的加载顺序决定。
拦截器:执行顺序取决于在Spring配置类中添加到InterceptorRegistry的顺序。
5. 使用场景
过滤器:适用于需要对请求进行预处理或后处理的场景,比如权限验证、字符编码转换、日志记录等。
拦截器:更适合用于Spring MVC项目中,特别是在需要对Controller层的方法调用进行控制时,例如权限校验、参数预处理等。
973

被折叠的 条评论
为什么被折叠?



