Spring拦截器与Servlet过滤器区别

前言

温馨提醒:希望读者了解Spring拦截器和Servlet过滤器基础知识

目录

前言

位置和层面

使用场景

配置方式

生命周期

执行顺序

总结


Spring拦截器基础知识https://blog.csdn.net/Dreamkidya/article/details/141825688?spm=1001.2014.3001.5501

Servlet过滤器基础知识https://blog.csdn.net/Dreamkidya/article/details/141292492?spm=1001.2014.3001.5501

位置和层面

  • Servlet过滤器(Filter)
    • Filter是servlet规范的一部分,属于javaEE标准,它位于servlet容器层面上,可以对几乎所有的请求进行拦截
    • 它是在DispatcherServlet之前执行 的,因此它的作用范围更广
  • Spring拦截器(Interceptor)
    • Interceptor是Spring框架的一部分,属于SPring的层面.他主要针对SPring的控制器进行拦截,通常用于对HanderMapping确定的请求进行拦截
    • Interceptor只处理经过DispatcherServlet的请求,因此它的范围小

使用场景

  • Servlet过滤器(Filter)

    • Filter通常用于通用的,与Web应用程序整体相关的功能.例如:编码设置,登录验证,权限检查,跨域问题处理,日志记录.
    • Filter可以拦截所有的请求类型,适合做一些全局性处理.
  • Spring拦截器

    • Interceptor更适合于与业务逻辑紧密相关的功能,如请求进入Controller之前进行预处理(如权限验证),在请求完成之后处理(如日志记录)等
    • 它专注于处理与控制器相关的请求,因此在业务逻辑处理中更加方便灵活

配置方式

Servlet过滤器(Filter)

Filter通过在web.xml文件中配置,或者使用@WebFilter注解来实现和配置。配置完成后,Filter会自动生效

现实过滤器:权限验证(token验证)

首先实现Filter接口--->重写doFilter()方法(此处没重写init()和destory())---->编写代码---->向后或者前返回

java 复制代码
@WebFilter(urlPatterns = "/api/*")
public class TokenFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        System.out.println("token验证过滤器");
        String token = request.getHeader("token");
        boolean verify = JWTUtil.verify(token);
        if (verify){
            filterChain.doFilter(servletRequest, servletResponse);
        }else {
            Result result = new Result(401,"token认证失败",null);
            servletResponse.getWriter().print(new ObjectMapper().writeValueAsString(result));
        }
    }
}

Spring拦截器(Interceptor)

Interceptor通过实现HandlerInterceptor接口,并在Spring的配置文件中(如spring.xml)进行配置,或者通过**@Configuration**类中的WebMvcConfigurer进行注册

现实拦截器:权限验证(Token验证)

首先实现HandlerInterceptor接口---->重写preHandle()方法----->编写代码---->返回true/false

java 复制代码
public class AdminTokenInterceptor implements HandlerInterceptor {

    /*
    拦截器处理的方法
    当请求到达处理器前,进入到拦截器进行处理
    返回true --- 离开拦截器,向后执行到达处理器
    返回false --- 不在向后执行
    */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String adminToken  = request.getHeader("adminToken");
       //这里假设Token为1234567  这里没有调用Jwt生成Token
        if (adminToken.equals("1234567")){
            return true;
        }else {
            //向前端响应
            Result result = new Result(401,"token验证失败",null);
            response.getWriter().write(new ObjectMapper().writeValueAsString(result));

        }
        return false;
    }
}

注册拦截器

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer{

//	注册配置拦截器
	public void addInterceptors(InterceptorRegistry registry) {
		InterceptorRegistration inter =  registry.addInterceptor(new AdminTokenInterceptor());
		inter.addPathPatterns("/**"); //配置进入拦截器的地址
		inter.excludePathPatterns("/loginCtl/login");//放行地址
		//inter.addPathPatterns("/user/**"); //用户需要拦截过滤地址
	}
}

生命周期

  • Servlet过滤器(Filter)

    • Filter的生命周期由Servlet容器管理。Filter在容器启动时初始化,在容器关闭时销毁。
  • Spring拦截器(Interceptor)

    • Interceptor的生命周期由Spring管理。Interceptor的初始化和销毁是与Spring的应用上下文(ApplicationContext)同步的。

执行顺序

  • Servlet过滤器(Filter)

    • Filter链(Filter Chain)中的过滤器是按照配置顺序执行的。Filter可以在请求到达Servlet之前处理,也可以在Servlet处理之后响应返回之前处理。
  • Spring拦截器(Interceptor)

    • Interceptor执行顺序由Spring的配置决定,支持多个拦截器按顺序执行。它提供了三个方法:preHandle、postHandle和afterCompletion,分别用于处理请求的不同阶段。(本文只重写postHandle)

总结

  • 过滤器 适用于全局性的、跨所有资源的处理任务。
  • 拦截器则更适用于特定于业务逻辑的控制器层面的请求处理
  • 在Spring项目中拦截器使用场景较多
相关推荐
小小小小宇7 分钟前
前端按需引入总结
前端
网安INF11 分钟前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
一叶知秋哈11 分钟前
Java应用Flink CDC监听MySQL数据变动内容输出到控制台
java·mysql·flink
jackson凌17 分钟前
【Java学习笔记】SringBuffer类(重点)
java·笔记·学习
sclibingqing22 分钟前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
小小小小宇24 分钟前
React 的 DOM diff笔记
前端
程序员JerrySUN26 分钟前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
糯米导航30 分钟前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计
小小小小宇31 分钟前
react和vue DOM diff 简单对比
前端
糯米导航33 分钟前
Java毕业设计:WML信息查询与后端信息发布系统开发
java·开发语言·课程设计