当前位置:首页 > 科技  > 软件

Java高频面试题:过滤器和拦截器两位难兄难弟区别

来源: 责编: 时间:2024-01-17 10:13:25 356观看
导读一、前言一直想着写一篇关于过滤器和拦截器,记得之前面试,面试官突然问了一个谈谈过滤器和拦截器的区别。当时脑瓜子嗡嗡的,这个没准备过,咋办,支支吾吾的说了先到过滤器在到拦截器。直接被说,你连请求来了经历那些都不知道

fs428资讯网——每日最新资讯28at.com

一、前言

一直想着写一篇关于过滤器和拦截器,记得之前面试,面试官突然问了一个谈谈过滤器和拦截器的区别。fs428资讯网——每日最新资讯28at.com

当时脑瓜子嗡嗡的,这个没准备过,咋办,支支吾吾的说了先到过滤器在到拦截器。fs428资讯网——每日最新资讯28at.com

直接被说,你连请求来了经历那些都不知道,怎么能行呢?fs428资讯网——每日最新资讯28at.com

虽然这个是八股文,但是还是比较有内容的,在项目中会使用到,在鉴权、日志记录等!fs428资讯网——每日最新资讯28at.com

从此之后,面试前第一件事,就是把过滤器和拦截器看一遍。fs428资讯网——每日最新资讯28at.com

今天好好总结一下,不需要在看别人写的了!fs428资讯网——每日最新资讯28at.com

不能为了面试而学习,咱们是为了掌握好他们,咱们今天从概念--->场景--->实战--->面试题。fs428资讯网——每日最新资讯28at.com

一步步层层递进,不让大家白白点开,一定是有所收获!fs428资讯网——每日最新资讯28at.com

执行顺序总体图:fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

二、过滤器

1、概念

过滤器是一种在 Java Web 应用中用于处理请求和响应的组件。它可以拦截客户端发起的请求,也可以拦截服务器返回的响应,对它们进行处理或者修改。fs428资讯网——每日最新资讯28at.com

过滤器属于Servlet规范的一部分,过滤器是用于执行过滤任务的对象,它可以在请求到达 Servlet 之前或响应发送给客户端之前执行一些额外的逻辑。fs428资讯网——每日最新资讯28at.com

2、应用场景

日志记录: 过滤器常用于记录请求和响应的日志,包括请求的路径、参数、处理时间等信息。fs428资讯网——每日最新资讯28at.com

身份验证和授权: 过滤器可以用于实现身份验证和授权逻辑,例如检查用户是否已登录,是否具有足够的权限访问某个资源。fs428资讯网——每日最新资讯28at.com

防御性编程: 过滤器可以用于对请求进行安全检查,防止潜在的攻击,比如阻止恶意请求、XSS(跨站脚本攻击)等。fs428资讯网——每日最新资讯28at.com

性能监控: 过滤器可以用于收集请求的处理时间、资源使用等信息,用于性能监控和优化。fs428资讯网——每日最新资讯28at.com

3、核心方法

先说一下过滤器的三个核心方法:init 方法:在过滤器被创建并添加到容器时调用,在过滤器的生命周期中只被调用一次。doFilter 方法:是过滤器的核心方法,用于处理请求和响应。可以进行前置处理、请求转发或链的调用,以及后置处理。(FilterChain.doFilter)destroy 方法:在过滤器被销毁前调用,用于进行资源释放和清理工作。在过滤器的生命周期中只被调用一次。fs428资讯网——每日最新资讯28at.com

4、实战

编写自己的过滤器配置类: 会把web开头的请求率先通过我们定义的过滤器,我们可以在里面进行权限的校验、记录日志等。fs428资讯网——每日最新资讯28at.com

多个过滤器,需要有执行顺序可以使用Spring注解@Order,也可以使用@WebFilter(urlPatterns="/web/order/"),通过请求去到下一个符合条件的过滤器!fs428资讯网——每日最新资讯28at.com

咱们使用的注解,需要在启动类加上扫描,不然过滤器是不会生效的!fs428资讯网——每日最新资讯28at.com

@ServletComponentScan。fs428资讯网——每日最新资讯28at.com

/** * @author wangzhenjun * @date 2023/11/22 15:34 */@Slf4j@WebFilter("/web/*")public class MyFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        Filter.super.init(filterConfig);    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        log.info("用户已经认证,继续处理");        log.info("用户有权限,继续处理");        chain.doFilter(request, response);        log.info("处理完成,放行之后");    }    @Override    public void destroy() {        Filter.super.destroy();    }}

测试访问,经过了过滤器,来到我们的Controller,最后重新会到过滤器内的doFilter方法!fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

三、拦截器

1、概念

拦截器(Interceptor)是一种在应用程序处理请求和响应的过程中,插入自定义处理逻辑的组件。拦截器是一种常见的设计模式,它允许在核心处理逻辑之前或之后执行额外的操作。fs428资讯网——每日最新资讯28at.com

一般出现在Spring MVC中,Spring MVC 中的拦截器实现原理主要基于 Spring 框架的 AOP和 HandlerInterceptor 接口。fs428资讯网——每日最新资讯28at.com

2、应用场景

敏感字检测:过滤器可以用于检测请求中的文本内容,包括表单提交、请求参数等,以查找是否包含敏感字。异常处理: 拦截器可以用于捕获和处理在请求处理过程中发生的异常。这使得开发者可以集中处理异常情况,返回合适的错误响应或记录异常信息。日志记录: 拦截器可用于记录请求和响应的日志信息,包括请求参数、响应状态码、执行时间等。国际化和本地化: 拦截器可以用于根据请求的语言或地区设置合适的国际化或本地化信息,以提供多语言支持。fs428资讯网——每日最新资讯28at.com

其实过滤器和拦截器很多场景他们两个都能实现。待会我们说一下区别在那里,都能实现一般采用什么方式去实现!fs428资讯网——每日最新资讯28at.com

3、核心方法

先说一下拦截器接口的三个核心方法:fs428资讯网——每日最新资讯28at.com

preHandle 方法: 在请求被处理之前调用。该方法在整个请求处理过程中是第一个被调用的方法。fs428资讯网——每日最新资讯28at.com

如果该方法返回 true,则请求继续进行后续的处理;如果返回 false,则中断请求处理,不会进入控制器方法。fs428资讯网——每日最新资讯28at.com

postHandle 方法: 在请求处理后、视图渲染前调用。在这个方法中,可以进行一些后置处理,如对ModelAndView的修改等。fs428资讯网——每日最新资讯28at.com

afterCompletion方法: 在整个请求完成后调用,即在视图渲染完毕或在处理过程中发生异常后调用。这个方法在请求完成后,不论请求处理过程中是否发生异常都会被调用。fs428资讯网——每日最新资讯28at.com

4、实战

先创建自己的拦截器类:MyInterceptor、fs428资讯网——每日最新资讯28at.com

/** * @author wangzhenjun * @date 2023/11/23 9:17 */@Slf4j@Componentpublic class MyInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {        log.info("===>拦截器<===:开始对数据进行敏感字过滤");        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,                           ModelAndView modelAndView) {        // 在请求处理后、视图渲染前执行的逻辑        log.info("===>拦截器<===:我可以改变一下modelAndView!");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,                                Exception ex) {        log.info("===>拦截器<===:释放资源");    }}

把自己的拦截器注册上:fs428资讯网——每日最新资讯28at.com

/** * @author wangzhenjun * @date 2023/11/23 10:54 */@Configurationpublic class MyWebConfig implements WebMvcConfigurer {    @Autowired    private MyInterceptor myInterceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(myInterceptor)                .addPathPatterns("/web/*");    }}

测试访问一下,拦截成功,走了我们自定义的拦截器!fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

四、面试题:二者有什么区别?

我们从下面几种情况来说一下二者的区别!fs428资讯网——每日最新资讯28at.com

1、出身不同

过滤器: 是基于 Java Servlet 规范的一部分,属于 Servlet 容器的一项功能。fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

拦截器: 是 Spring MVC 框架的一部分,属于 Spring 框架的一项特性。fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

2、应用场景不同

过滤器: 主要用于全局范围的请求和响应处理,可以对所有请求进行通用性的处理,例如性能监控、身份验证、日志记录等。fs428资讯网——每日最新资讯28at.com

拦截器: 主要用于对控制器方法的请求和响应进行处理,拦截器的配置更加灵活,拦截器更接近业务系统,可以实现特定业务逻辑的拦截,例如敏感字检测、异常监控等。fs428资讯网——每日最新资讯28at.com

我们把握住侧重点核心是在:fs428资讯网——每日最新资讯28at.com

过滤器:通用性功能拦截器:业务逻辑方面。fs428资讯网——每日最新资讯28at.com

3、实现原理不同

过滤器的底层实现原理是基于方法回调实现的,我们在doFilter方法中看到chain.doFilter(request, response);,这个就是核心,我们看一下他的源码:fs428资讯网——每日最新资讯28at.com

/*** FilterChain 是 servlet 容器提供给开发人员的一个对象,用于查看已过滤资源请求的调用链。* 筛选器使用 FilterChain 调用链中的下一个筛选器,或者如果调用筛选器是链中的最后一个筛选器,则调用链末尾的资源。*/public interface FilterChain {    /**     * 导致调用链中的下一个筛选器,或者如果调用筛选器是链中的最后一个筛选器,     * 则会导致调用链末尾的资源。     */    public void doFilter(ServletRequest request, ServletResponse response)            throws IOException, ServletException;}

拦截器的底层实现原理基于动态代理(HandlerInterceptor 的代理对象是通过AOP机制实现的)和反射机制实现的。fs428资讯网——每日最新资讯28at.com

过滤器链HandlerExecutionChain类,有兴趣的可以看一下!fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

4、执行顺序

我们刚刚就在实战中看到了执行顺序:fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

我们在看一下代码中的执行顺序,先执行过滤器,在执行拦截器,最后才会进入真正的要调用的方法。fs428资讯网——每日最新资讯28at.com

fs428资讯网——每日最新资讯28at.com

五、总结

看到这里都是成功人士,对于一个面试题,我们不能只背一下,而是从多方面去了解它,这样才能印象深刻。fs428资讯网——每日最新资讯28at.com

况且,过滤器和拦截器在企业级应用中还是很常见的,特别是拦截器,谁能说自己的项目里没有使用!fs428资讯网——每日最新资讯28at.com

过滤器侧重通用性,拦截器侧重业务,更加灵活!fs428资讯网——每日最新资讯28at.com

当然有些东西,使用AOP,自己定义个注解,来进行切面,做一下日志记录,监控啥的也是挺好的。fs428资讯网——每日最新资讯28at.com

大家根据自己的场景来选择。fs428资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-63226-0.htmlJava高频面试题:过滤器和拦截器两位难兄难弟区别

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 程序开发中常用的十种算法,你用过几种?

下一篇: 精准解析 useLayoutEffect 与 useEffect 的执行时机

标签:
  • 热门焦点
  • 《英雄联盟》夏季赛总决赛今日开打!JDG对阵LNG首发名单来了 Knight:准备三连冠

    8月5日消息,今日17:00,《英雄联盟》2023LPL夏季赛总决赛将正式开打,由JDG对阵LNG。对两支队伍来说,这场比赛不仅要争夺夏季赛冠军,更要决定谁才是LPL赛区一
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
Top