彻底明白Filter与Interceptor

开发 前端
通过实现javax.servlet.Filter,对请求进行过滤拦截,进而做统一处理。最后将请求交给Servlet进行处理并生成得到响应。得到响应以后,Filter可以对响应再次进行处理。

Filter(过滤器)

概述

Servlet规范中定义的一种组件,用于在请求进入Servlet之前或响应返回客户端之前执行一些操作。它依赖于Servlet容器,几乎可以对任何请求进行过滤,随着Web应用的启动而启动,Web应用停止则Filter销毁。

工作原理

通过实现javax.servlet.Filter,对请求进行过滤拦截,进而做统一处理。最后将请求交给Servlet进行处理并生成得到响应。得到响应以后,Filter可以对响应再次进行处理。

图片图片

应用场景

如进行过滤低俗文字,危险字符,日志记录、权限验证、字符编码处理等等。如防XSS攻击的XSSFilter过滤器。

代码实现(SpringBoot举例)

创建Filter类

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 在请求处理之前执行的操作
        // 可以对请求进行修改、验证等操作
        chain.doFilter(request, response);
        // 在响应返回客户端之前执行的操作
        // 可以对响应进行修改、记录日志等操作
    }
    @Override
    public void destroy() {
        // 销毁操作
    }
}

注册Filter

在Spring Boot中,我们可以通过配置类或使用@WebFilter注解来注册Filter。

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<MyFilter> myFilter() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/api/*"); // 设置过滤的路径
        return registrationBean;
    }
}

Interceptor 拦截器介绍

概述

Interceptor是Spring框架提供的一种拦截器,与Servlet无关,它依赖于Web框架,用于在Controller方法执行前后进行处理。与Filter不同,Interceptor是Spring MVC框架特有的组件。它可以将一些共有的行为动作给通用化、标准化,进而让代码更加简洁,可扩展性更高。

原理

图片图片

基于实现HandlerInterceptor接口,并重写它的方法。它有如下方法:

  • preHandle方法:目标资源方法执行前执行。返回true则继续往下执行 返回false则进行拦截。
  • postHandle方法:目标资源方法执行后执行
  • afterCompletion方法:视图渲染完毕后执行,最后执行。

应用场景

Interceptor主要用于处理与Controller相关的逻辑,比如权限验证、日志记录、统一异常处理等。

代码实现

创建Interceptor类

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在Controller方法执行前执行的操作
        // 返回true表示继续执行,返回false表示中断执行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 在Controller方法执行后、视图渲染前执行的操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        // 在整个请求完成后执行的操作
    }
}

注册Interceptor

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 InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/api/**") // 设置拦截的路径
                .excludePathPatterns("/api/public/**"); // 设置排除的路径
    }
}

Filter与Interceptor的区别及如何选择

执行时机不同

  • Filter:在请求进入Servlet之前和响应返回客户端之前执行。
  • Interceptor:在Controller方法执行前、执行后、视图渲染前以及整个请求完成后执行。

范围

  • Filter:作用于整个Web应用,不仅限于Spring MVC。
  • Interceptor:仅作用于Spring MVC中的Controller层。

使用场景

  • Filter:适用于通用的请求处理逻辑,比如字符编码、日志记录等。
  • Interceptor:适用于与Controller相关的业务逻辑,比如权限验证、统一异常处理等。
责任编辑:武晓燕 来源: 程序员无名
相关推荐

2023-12-27 08:16:54

Sessiontoken安全性

2020-12-08 08:14:11

SQL注入数据库

2019-08-21 08:24:34

技术过滤器代码

2024-05-09 09:09:19

组合模式对象

2024-05-13 10:45:25

中介模式面向对象数量

2024-05-10 08:43:04

外观模式接口系统

2009-06-16 11:44:00

Java IO系统

2022-02-28 09:44:09

Linux硬链接软链接

2024-02-26 00:00:00

Redis持久化AOF

2019-08-27 14:46:59

ElasticSearES数据库

2022-01-13 10:04:21

拦截器Interceptor过滤器

2023-04-26 01:17:16

恶意注册Java验证

2024-05-11 14:18:44

迭代器模式业务

2024-05-17 10:08:59

享元模式分类方式

2020-10-26 07:02:11

ConcurrentH存储

2023-05-29 08:45:45

Java注解数据形式

2020-09-29 06:44:28

Redis延时队列

2024-05-15 17:41:37

备忘录模式多线程

2017-06-07 18:40:33

PromiseJavascript前端

2020-02-06 14:57:11

明白SpringMvc异步处理
点赞
收藏

51CTO技术栈公众号