过滤器(Filter)与拦截器(Interceptor)

本文介绍了JavaWeb中的Filter过滤器和Interceptor拦截器的概念、实现过程、执行流程以及两者之间的区别,包括接口规范、执行时机、拦截范围和适用场景。
摘要由CSDN通过智能技术生成

过滤器 Filter

  • 概念:Filter过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
  • 作用:可以把客户端对服务端资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器通用的操作,比如:登录校验、统一编码处理等。

过滤器实现过程

  • 定义一个类去实现Filter接口,根据自身需求实现里面的方法(通常只需要重写doFilter方法即可)。
  • 实现类的类名上方添加注解@WebFilter(urlPatterns = "/*"),urlPatterns代表的是需要拦截的资源请求路径(此时是对所有的资源请求路径均拦截)。
  • 完成以上两步之后还需在启动类上方加上注解@ServletComponentScan来开启对servlet组件的支持。

过滤器Filter的执行流程

请求 ---> 放行前逻辑 ---> 放行 ---> 目标资源 ---> 放行后逻辑

过滤器链

当一个web应用中,配置多个过滤器时,就会形成一个过滤器链,过滤器链的执行流程是按照过滤器名的升序来执行的(a---z || A-Z),当正在执行的过滤器放行时,会进入下一个过滤器继续执行,当达到最后一个过滤器时,才会去访问目标资源,随后再倒着回去(类似函数的递归调用)。


拦截器 Interceptor

  • 概念:Interceptor是一种特殊的组件,可以在请求处理的过程中对资源的请求和响应进行拦截和处理。
  • 作用:可以在资源请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定的操作。

拦截器实现过程

第一、定义拦截器

定义一个类去实现HandlerInterceptor接口,重写接口中的所有方法。

  • 方法一:boolean preHandle()。执行时机:在目标资源方法执行前执行,返回true:放行,返回false:不放行。
  • 方法二:void postHandle()。执行时机:在目标资源方法执行后执行。
  • 方法三:void afterCompletion()。执行时机:在视图渲染完毕后执行,最后执行。

代码示例

package com.fhh.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

第二、注册拦截器(配置)

  • 第一:定义一个类去实现WebMvcConfigurer接口,重写其中的addInterceptors(InterceptorRegistry registry)方法。
  • 第二:在方法中指定我们定义好的拦截器与拦截路径。
    • 通过registry中的addInterceptor()方法来指定拦截器。
    • 通过addPathPatterns()方法来指定资源拦截路径。
    • 通过excludePathPatterns()方法指定在资源拦截路径中不需要拦截的资源请求路径。

指定资源拦截路径时有以下选择

代码示例

package com.fhh.config;

import com.fhh.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 {

    // 注入LoginCheckInterceptor对象
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    // 进行注册
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addInterceptor:需要注册的拦截器
        // addPathPatterns:需要拦截哪些资源(只对于Controller层)
        // excludePathPatterns:不需要拦截哪些资源
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }

}

拦截器的执行流程


过滤器与拦截器的区别

  • 接口规范:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 执行时机:过滤器在拦截器之前执行,拦截器在处理器之前执行。
  • 拦截范围:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。
  • 拦截对象:filter拦截对象为service服务层,而interceptor拦截对象为Controller数据访问层。
  • 使用场景:过滤器主要用于对请求和响应的全局处理,而拦截器主要用于对特定请求的处理。
  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值