字节面试官问我拦截器与过滤器的区别

文章对比了拦截器和过滤器在执行位置、范围和面向对象方面的差异,强调拦截器是SpringMVC框架特有的,主要用于控制器方法的拦截。过滤器则更为通用,可处理所有请求和响应,但无法精确到具体方法。自定义拦截器的实现包括实现HandlerInterceptor接口并配置在SpringMVC的配置文件中。
摘要由CSDN通过智能技术生成

1 拦截器 VS 过滤器

执行位置和范围

  • 过滤器:Servlet 规范中的一部分,任何java web工程都可以使用。
  • 拦截器:SpringMVC 框架自己的,只有使用了SpringMVC框架的工程才能用。

面向对象不同

  • 过滤器:过滤器是基于Servlet规范的,它对请求和响应进行拦截和处理。它可以在请求到达Servlet之前预处理请求,也可以在响应返回给客户端之前后处理响应。
  • 拦截器:拦截器是针对框架提供的处理器(如控制器)进行拦截和处理。它主要关注请求处理的前后环节,可以在方法执行前后、异常处理等时机进行拦截和增强。**拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。**它也是 AOP 思想的具体应用。

使用场景

  • 过滤器:具有较高的灵活性,可以拦截和处理所有的请求和响应。它可以在请求处理前和响应返回前进行预处理和后处理,但对于具体的处理器(如控制器)内部逻辑的拦截是有限的。过滤器只能对URL模式进行匹配和拦截,无法对具体的控制器方法进行精确的拦截。过滤器是在请求到达Servlet之前进行处理的,无法直接针对具体的控制器方法进行拦截和增强。
  • 拦截器:拦截器相对于过滤器而言具有更高的定制性和灵活性。它可以针对具体的处理器(如控制器)进行拦截和增强,可以选择性地拦截请求,并且可以在请求处理前、处理后、异常处理等时机进行拦截和增强。拦截器是在Servlet容器中运行的,因此它无法直接拦截非Servlet请求,如静态资源的访问或其他非HTTP协议的请求。对于这些请求,可能需要使用其他方式进行拦截或处理。

2 自定义拦截器

我们要想自定义拦截器,要求必须实现:HandlerInterceptor 接口
第一步,新建一个类实现HandlerInterceptor

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

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

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
        // 在控制器方法执行前调用,返回true表示继续处理,返回false表示中断请求处理
        System.out.println("CustomInterceptor - preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 在控制器方法执行后、视图渲染前调用
        System.out.println("CustomInterceptor - postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    throws Exception {
        // 在视图渲染后调用,即在DispatcherServlet进行视图清理之后调用
        System.out.println("CustomInterceptor - afterCompletion");
    }
}

第二步,配置拦截器(在springmvc.xml中)

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

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/**"); // 拦截所有路径
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jayden 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值