SpringBoot的过滤器、拦截器、监听器(补档)

        在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层的方法调用进行控制时,例如权限校验、参数预处理等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值