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

[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别

🌈键盘敲烂,年薪30万🌈

目录

一、过滤器filter

概念介绍:

过滤器的使用:

过滤器的执行流程:

应用场景(登录校验):

二、拦截器Interceptor

概念介绍:

拦截器的使用:

执行流程:

三、拦截器与过滤器区别:

📕总结


一、过滤器filter

概念介绍:

过滤器是JavaWeb的三大核心组件之一,它是用来拦截请求的,拦截到请求之后执行相应的逻辑决定是否放行该请求,从而实现一些特殊功能。

注意:

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

过滤器的使用:

  • ①定义一个类,实现Filter接口,重写其所有的方法
  • ②在该类上加 @WebFilter(urlPatterns="/xxx") 注解,指定拦截的请求路径
  • ③在启动类加@ServletComponentScan ,由于filter隶属Web服务器,所以要在spring开启Servlet组件支持。

🍋3种拦截路径 

Filter接口的方法

default void init :初始化方法,Web服务器启动,创建Filter时调用,只调用一次

void doFilter : 拦截到请求时,调用该方法,可调用多次        

default void destroy : 销毁方法,服务器关闭时调用,只调用一次

过滤器的执行流程:

注意:

放行后访问对应的Web资源,资源访问后,会回到过滤器执行放行后逻辑!!!

应用场景(登录校验):

分析:例如学生管理系统,客户端在发送查询请求时,服务器要先判断该请求是否为登录请求,若是,放行执行登录操作,若不是,判断是否是已登录用户,只有登录的才相应你的查询请求。

@WebFilter("/*") //拦截所有请求
public class CheckLogin implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse res = (HttpServletResponse) servletResponse;//检查是否为登录请求StringBuffer sburl = req.getRequestURL();String url = sburl.toString();if(url.contains("login")){log.info("登录请求 放行");filterChain.doFilter(servletRequest, servletResponse);return;}//不是登录请求,判断是否是已登录用户//获取jwt令牌String jwt = req.getHeader("token");log.info("jwt令牌{}", jwt);//jwt为null 或 ""//返回未登录信息 json格式if(!Strings.hasLength(jwt)){log.info("jwt令牌为null 或 \"\" ");//返回错误信息Result error = Result.error("NOT_LOGIN");//获取json格式的字符串String jsonString = JSONObject.toJSONString(error);//获取输出流res.getWriter().write(jsonString);return;}//校验jwt令牌try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();//解析出错 返回错误信息Result error = Result.error("NOT_LOGIN");//获取json格式的字符串String jsonString = JSONObject.toJSONString(error);//获取输出流res.getWriter().write(jsonString);return;}//放行log.info("放行");filterChain.doFilter(servletRequest, servletResponse);}
}

二、拦截器Interceptor

概念介绍:

类似于过滤器。Spring框架中提供的,用来动态拦截controller层方法的执行。

拦截器的使用:

  • ①定义拦截器:定义一个实现HandlerInterceptor接口的实现类,并重写其所有方法。
  • ②注册拦截器:定义WebMvcConfigurer接口的实现类,重写注册拦截器的方法addInterceptors来指定拦截路径

🍋拦截路径

注意:

注册拦截器相当于配置文件,要加@Configuration注解,并且要利用依赖注入获取定义的拦截器对象

拦截器是控制Controller层的请求,所以要加@Compoent注解 

执行流程:


代码演示:

//注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {@AutowiredLoginCheckInterceptor loginCheckInterceptor;@Override //注册一个拦截器public void addInterceptors(InterceptorRegistry registry) {//添加一个拦截器并拦截除登录外的所有请求registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}//定义拦截器
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //拦截前运行,返回true放行,false不放行public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {log.info("拦截到请求,执行相应逻辑xxx");
}
@Override //放行后执行该方法public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("请求被放行了");}@Override //响应前执行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("请求响应之前的方法");}

三、拦截器与过滤器区别:

通常情况下,过滤器更适用于URL级别的过滤和处理,而拦截器更适用于方法或请求级别的拦截和处理。

  1. 调用顺序:先调用过滤器,在调用拦截器,因为过滤器属于Web容器,拦截器属于spring框架。

  2. 作用范围:过滤器拦截所有Url请求,拦截器只拦截spring框架中controller层的方法

  3. 功能:过滤器主要用于对请求进行预处理和后处理,如请求编码转换、参数过滤、请求日志记录等。拦截器主要用于对请求进行拦截和拦截后的处理,如权限验证、登录验证、日志记录等。

  4. 调用方式:过滤器通过在web.xml文件中配置进行调用,对请求进行预处理和后处理。拦截器则是通过框架提供的注解或配置方式进行调用。

📕总结

  • 过滤器隶属Web容器,定义一个过滤器需实现Filter接口,并加入@WebFilter(urlPatterns="/x")注解指定拦截路径。
  • 拦截器隶属Spring框架,定义一个拦截器需要实现HandlerInterceptor接口,并定义一个注册拦截器的类加入@Configuration注解。

相关文章:

  • leetCode 494. 目标和 + 动态规划 + 记忆化搜索 + 递推 + 空间优化
  • 致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC]
  • Pytest UI自动化测试实战实例
  • DI93a HESG440355R3 通过其Achilles级认证提供网络安全
  • 如何当好一面面试官?
  • 个体诊所电子处方系统有哪些?个体门诊处方管理系统
  • Jenkins自动化部署简单配置
  • Go错误包装
  • React18新特性?
  • 【书籍篇】Spring实战第4版 第1部分 Spring的核心
  • 【qemu逃逸】HWS2017-FastCP
  • Paddle炼丹炉炸了Unexpected BUS error encountered in DataLoader worker
  • 计算机网络第4章-网络层(1)
  • 通讯网关软件032——利用CommGate X2OPC实现OPC客户端访问Modbus TCP设备
  • 1,Opencv常用结构
  • 【css3】浏览器内核及其兼容性
  • 【EOS】Cleos基础
  • 〔开发系列〕一次关于小程序开发的深度总结
  • linux安装openssl、swoole等扩展的具体步骤
  • Next.js之基础概念(二)
  • nodejs调试方法
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python实现BT种子转化为磁力链接【实战】
  • 从输入URL到页面加载发生了什么
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 异步
  • 由插件封装引出的一丢丢思考
  • 正则学习笔记
  • ionic异常记录
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)(1.13) SiK无线电高级配置(六)
  • (3)STL算法之搜索
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)nsfocus-绿盟科技笔试题目
  • (转)原始图像数据和PDF中的图像数据
  • .NET CLR基本术语
  • .net 生成二级域名
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net中的Queue和Stack
  • :=
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Apio2012]dispatching 左偏树
  • [CISCN 2023 初赛]go_session
  • [Django ]Django 的数据库操作
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本