当前位置: 首页 > article >正文

Spring拦截器与Servlet过滤器区别

前言

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

目录

前言

位置和层面

使用场景

 配置方式

生命周期

执行顺序

总结


Spring拦截器基础知识icon-default.png?t=N7T8https://blog.csdn.net/Dreamkidya/article/details/141825688?spm=1001.2014.3001.5501

Servlet过滤器基础知识icon-default.png?t=N7T8https://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())---->编写代码---->向后或者前返回

@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

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;
    }
}

注册拦截器

@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的配置决定,支持多个拦截器按顺序执行。它提供了三个方法:preHandlepostHandleafterCompletion,分别用于处理请求的不同阶段。(本文只重写postHandle)

总结

  • 过滤器适用于全局性的、跨所有资源的处理任务。
  • 拦截器则更适用于特定于业务逻辑的控制器层面的请求处理
  • 在Spring项目中拦截器使用场景较多

http://www.kler.cn/a/294324.html

相关文章:

  • SpringBoot(十八)SpringBoot集成Minio
  • 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
  • 执行flink sql连接clickhouse库
  • WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等
  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • 设计模式之责任链模式(Chain Of Responsibility)
  • Unity3D DOTS Component详解
  • 人机交互中的当斯定律
  • Redis数据持久化方法
  • 要在nginx中配置后端三个服务器的轮询和加权
  • Linux下安装和使用SVN及常用操作命令详解
  • 玩转Python Turtle库,实现满屏飘字的魔法!
  • vite项目配置本地开发使用https访问
  • 后背筋膜炎怎么治疗才能除根
  • 【数据结构】你知道什么是二叉树的顺序存储结构吗?
  • 移动端视频编辑SDK解决方案,AI语音识别添加字幕
  • OpenAI计划提高ChatGPT的价格——你需要了解的事项
  • 【数据结构】—— 栈与队列
  • 标准c++3
  • day09-IO-字符流其它流
  • 无人机电调接线
  • PDF文件压缩,总结了五种压缩方法
  • 【路径规划】在MATLAB中使用粒子群优化(PSO)进行最优移动机器人路径规划
  • 攻防世界 Web_php_unserialize
  • HTTP协议到HTTPS的Java客户端改造
  • Leetcode面试经典150题-92.反转链表II