过滤器、监听器、拦截器的区别

过滤器、监听器、拦截器的区别

  • 过滤器(filter)、监听器(Listener)是JavaWeb的三大组件。
  • 而拦截器(Interceptor)是Spring框架中的。

我们主要是要分清除过滤器和拦截器的区别:

  1. 实现原理 :过滤器是基于函数回调 实现的,而拦截器是基于java的反射机制
  2. 使用范围:过滤器Filter的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。而拦截器是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
  3. 触发时机 :

    从图中我看可以看出,过滤器Filter是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。而拦截器Interceptor是在请求进入servlet后,在进入Controller之前进行预处理的,Controller中渲染了对应的视图之后请求结束。

执行顺序

配置Filter:

java 复制代码
package com.qcby.demo.config;

import org.springframework.stereotype.Component;

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

@Component
public class MyFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("Filter 前置过滤");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("Filter 处理中");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

        System.out.println("Filter 后置过滤");
    }
}

自定义拦截器

java 复制代码
package com.qcby.demo.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor 前置拦截");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor 后置拦截");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor 最终拦截");
    }
}

配置拦截器

java 复制代码
package com.qcby.demo.config;

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 MyConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**") // 设置要拦截的
                .excludePathPatterns("/test1");// 设置不拦截的
    }
}

控制器

java 复制代码
package com.qcby.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("test")
public class TestController {

    @GetMapping("/test1")
    public String test() {
        return "123456";
    }
}

项目启动之后,我们会发现过滤器的init()方法,随着容器的启动进行了初始化:

然后浏览器访问对应的端口号:http://localhost:8080/test/test1,会有以下输出:

这样就验证了我们前边的过滤器和拦截器的触发顺序。

对于拦截器的触发时机,在只有一个拦截器 时:

有多个拦截器时

过滤器的应用场景

  1. 过滤敏感词汇(防止sql注入)
  2. 设置字符编码
  3. URL级别的权限访问控制
  4. 压缩响应信息

拦截器的应用场景

  1. 登录验证,判断用户是否登录。
  2. 权限验证,判断用户是否有权限访问资源,如校验token
  3. 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  4. 处理cookie、本地化、国际化、主题等。
  5. 性能监控,监控请求处理时长等。
  6. 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

参考文献

相关推荐
草莓base1 小时前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
乌啼霜满天2491 小时前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
Elaine2023912 小时前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
Bald Baby3 小时前
JWT的使用
java·笔记·学习·servlet
.生产的驴4 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
码蜂窝编程官方7 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
AuroraI'ncoding7 小时前
时间请求参数、响应
java·后端·spring
计算机毕设指导610 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
牙牙70510 小时前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
ExiFengs11 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring