Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • Java核心基础

    • 基础篇

      • Java常用关键字
      • 写了那么久的String字符串,你可能根本不懂它!
      • 详解Java中的BIO、NIO、AIO
      • 一篇文章带你了解cloneable接口、浅拷贝、深拷贝
      • 谈一谈session和cookie的区别,以及session的实现机制
      • 什么是接口的幂等性,如何实现接口幂等性?一文搞定
      • Java16都快上线了,你该不会连Java8的特性都不会用吧?
      • Java中的拦截器和过滤器有什么区别
        • (一)什么是过滤器
        • (二)什么是拦截器
        • (三)拦截器与过滤器的区别
        • (四)总结
      • 你能保证你的代码没有异常吗?
      • 时间类有多复杂,JDK竟设计了三版
      • JavaIO的整体结构以及File类的使用
      • javaIO之字节流与字符流
    • 集合类

    • JVM虚拟机

    • Java并发

  • 框架的艺术

  • 分布式与微服务

  • 开发经验大全

  • 版本新特性

  • Java
  • Java核心基础
  • 基础篇
CodeEase
2023-09-14
目录

Java中的拦截器和过滤器有什么区别

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)什么是过滤器

过滤器Filter基于Servlet实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet的工作原理是拦截配置好的客户端请求,然后对Request和Response进行处理。Filter过滤器随着web应用的启动而启动,只初始化一次。

Filter的使用比较简单,继承Filter 接口,实现对应的init、doFilter以及destroy方法即可。

1、init:在容器启动时调用初始化方法,只会初始化一次

8-1.png

2、doFilter:每次请求都会调用doFilter方法,通过FilterChain 调用后续的方法

8-2.png

3、destroy:当容器销毁时,执行destory方法,只会被调用一次。

8-3.png

下面是详细的代码编写方式:

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化拦截器");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //做一些处理
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        System.out.println("销毁拦截器");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# (二)什么是拦截器

拦截器是SpringMVC中实现的一种基于Java反射(动态代理)机制的方法增强工具,拦截器的实现是继承HandlerInterceptor 接口,并实现接口的preHandle、postHandle和afterCompletion方法。

1、preHandle:请求方法前置拦截,该方法会在Controller处理之前进行调用,Spring中可以有多个Interceptor,这些拦截器会按照设定的Order顺序调用,当有一个拦截器在preHandle中返回false的时候,请求就会终止。

2、postHandle:preHandle返回结果为true时,在Controller方法执行之后,视图渲染之前被调用

3、afterCompletion:在preHandle返回ture,并且整个请求结束之后,执行该方法。

具体的代码实现如下,首先编写一个拦截器:

@Component
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        String userName=request.getParameter("userName");
        String password = request.getParameter("password");
        if (userName==null||password==null){
            response.setStatus(500);
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().print("参数缺失");
            return false;
        }
        //进行用户校验
        if (userName.equals("admin")&&password.equals("admin")){
            return true;
        }else {
            response.setStatus(500);
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().print("用户名或密码错误");
            return false;
        }
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

编写完拦截器之后,通过一个配置类设置拦截器,并且可以通过addPathPatterns和excludePathPatterns执行哪些请求需要被拦截,哪些不需要被拦截。

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Autowired
    private UserInterceptor userInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/error");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# (三)拦截器与过滤器的区别

相同点:

1、拦截器与过滤器都是体现了AOP的思想,对方法实现增强,都可以拦截请求方法。

2、拦截器和过滤器都可以通过Order注解设定执行顺序

不同点:

1、过滤器属于Servlet级别,拦截器属于Spring级别 Filter是在javax.servlet包中定义的,要依赖于网络容器,因此只能在web项目中使用。

Interceptor是SpringMVC中实现的,归根揭底拦截器是一个Spring组件,由Spring容器进行管理。

2、过滤器和拦截器的执行顺序不同:

下面通过一张图展示Filter和Interceprtor的执行顺序

8-4.jpeg

首先当一个请求进入Servlet之前,过滤器的doFilter方法进行过滤,

进入Servlet容器之后,执行Controller方法之前,拦截器的preHandle方法进行拦截,

执行Controller方法之后,视图渲染之前,拦截器的postHandle方法进行拦截,

请求结束之后,执行拦截器的postHandle方法。

3、过滤器基于函数回调方式实现,拦截器基于Java反射机制实现

# (四)总结

实际开发中,拦截器的应用场景会比过滤器要更多,下面是拦截器和过滤器的主要应用场景

拦截器的应用场景:权限控制,日志打印,参数校验

过滤器的应用场景:跨域问题解决,编码转换

我翻了一下历史项目的代码,拦截器在用户权限校验场景下使用会比较多,由于一般是前后端分离项目,过滤器的使用场景就会少很多。

8-5.png

拦截器和过滤器算是比较常用的了,但是还是得注意两者的差距,我是鱼仔,我们下期再见!

上次更新: 2025/04/29, 17:22:06
Java16都快上线了,你该不会连Java8的特性都不会用吧?
你能保证你的代码没有异常吗?

← Java16都快上线了,你该不会连Java8的特性都不会用吧? 你能保证你的代码没有异常吗?→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式