面试官:谈谈过滤器和拦截器的区别?

article/2025/10/7 17:03:02

点击关注公众号,Java干货及时送达👇

8eeb561121f25b577e032a06dfe3769b.png来源:blog.csdn.net/qq_42924666/article/details/109563400

  • 一、拦截器和过滤器的区别

  • 二、拦截器和过滤器的代码实现

  • 三、总结

    • 1、什么是Filter及其作用介绍

    • 2、Filter API介绍

    • 3、Filter链与Filter生命周期

  • 四、拦截器

  • 五、过滤器和拦截器的区别


一、拦截器和过滤器的区别

1、拦截器(Interceptor)只对action请求起作用 即对外访问路径

而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件

2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行

而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行

web.xml加载顺序:context- param -> listener -> filter -> servlet

在请求结束返回时也是一样 是在Servlet处理完之后返回给前端之间执行

28d84040913a812d0357773bfcf3ca7b.png

图片

二、拦截器和过滤器的代码实现

1、拦截器

首先需要一个拦截器类 并且这个类要实现HandlerInterceptor接口

这个接口里面有三个方法:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{// 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然return false;
}@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{// 在处理过程中(Controller方法处理完之后  DispatcherServlet进行视图的渲染之前)执行拦截
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{// 在DispatcherServlet进行视图的渲染后 返回前进行拦截
}

稍微写一下方法:

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{// 在Controller方法处理之前执行拦截 若返回的是false则中断执行 反之亦然// 判断当前的User是否为空 若不为空则不拦截if (request.getSession().getAttribute("USERINFO")!=null){return true;}// 进行拦截 返回登录界面response.sendRedirect(request.getContextPath()+"/user/doLogin.do");return false;}

然后需要去SpringMVC的配置文件中配置拦截器:

<!-- 配置拦截器 -->
<mvc:interceptors><mvc:interceptor><!-- 拦截所有的mvc控制器(Controller) --><mvc:mapping path="/**"/><!-- 放行机制 指定对某个页面不进行拦截 --><!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 --><mvc:exclude-mapping path="/user/doLogin.do"/><!-- 指定使用哪个拦截器 --><bean class="net.zjitc.interceptor.LoginInterceptor"/></mvc:interceptor>
</mvc:interceptors>

如此 当访问的请求不为/user/doLogin.do会被拦截然后重定向到/user/doLogin.do

但是访问其它的页面不会被拦截

想要让页面也被拦截?你需要过滤器!

2、过滤器

同理 需要一个过滤器类 然后实现javax.servlet.Filter接口

注意Filter的路径别导错了 因为有很多同名接口

public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException{// 过滤器初始化}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{}@Overridepublic void destroy(){// 过滤器销毁}
}

稍微写一下方法:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{// ServletRequest是一个接口 而HttpServletRequest是接口的实现// 但有些方法是HttpServletRequest独有的 例如getSession()// HttpServletRequest接口继承自ServletRequest接口 增加了和Http相关的方法// 但是我们可以强制转换HttpServletRequest request=(HttpServletRequest)servletRequest;HttpServletResponse response=(HttpServletResponse)servletResponse;// 若用户没有登录if (request.getSession().getAttribute("USERINFO")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1){response.sendRedirect(request.getContextPath()+"/user/doLogin.do");}// 若用户已经登录 则继续下一个请求(继续访问)filterChain.doFilter(request,response);
}

然后需去web.xml中配置过滤器:

<!-- 配置自定义的Filter 实现登录控制 --><filter><filter-name>sessionFilter</filter-name><filter-class>net.zjitc.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>sessionFilter</filter-name><!-- 拦截所有的页面 /斜杠代表在webapp目录下 --><url-pattern>/pages/*</url-pattern><url-pattern>/css/*</url-pattern><url-pattern>/img/*</url-pattern><url-pattern>/failer.jsp</url-pattern></filter-mapping>

三、总结

拦截器和过滤器其实都是AOP编程思想的实现

都可以体现例如权限的检查 日志的记录等功能

但是有不同之处:

1、使用范围不同
  • 拦截器既可以用在web层 又可以用在Application和Swing程序中

  • 而filter是Servlet规范规定的 只能用于web程序中

2、规范不同
  • 拦截器是在Spring容器内的 是Spring框架支持的

  • 而filter是Servlet规范规定的 是Servlet容器支持的


1、什么是Filter及其作用介绍

(1)概念

Servlet规范中三个技术 Servlet Listener Filter(顺序为L F S)

Filter是sun公司中servlet2.3后增加的一个新功能,在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器

(2)作用

通过Filter可以拦截访问web资源的请求与响应操作。

WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

(3)举例

在java web中,针对传入的request,或response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

2、Filter API介绍

Filter是javax.servlet包下的一个接口主要有以下三个方法

destory()
doFilter(ServletRequest request,ServletResponse response,FilterCjain chain)
init(FilterConfig filterConfig)

3、Filter链与Filter生命周期

(1)Filter链介绍

多个Filter对同一个资源进行了拦截,那么当我们在开始的Filter中执行chain.doFilter(request,response)时,是访问下一下Filter,直到最后一个Filter执行时,它后面没有了Filter,才会访问web资源。

(2)关于多个FIlter的访问顺序问题

如果有多个Filter形成了Filter链,那么它们的执行顺序是怎样确定的?

它们的执行顺序取决于在web.xml文件中配置的先后顺序。

(3)Filter生命周期

  • 当服务器启动,会创建Filter对象,并调用init方法,只调用一次.

  • 当访问资源,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.

  • 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作

  • 过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

四、拦截器

拦截器是spring容器的,是spring支持的

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。

在面向切面编程AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。

比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

五、过滤器和拦截器的区别

  • ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。

  • ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

  • ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

  • ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

  • ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

  • ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

ceedaf8e64b38c0a57528c2dc50ae2b8.png

图片

 
 
 
 
 
(完)
码农突围资料链接1、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈。

http://chatgpt.dhexx.cn/article/xitevSS3.shtml

相关文章

springboot(13)拦截器和过滤器的区别

1. 解释拦截器和过滤器的概念 拦截器是一种拦截请求并在请求到达目标之前执行某些任务的机制。 过滤器是一种修改或拦截请求或响应的机制。通常&#xff0c;它们用于在特定的请求或响应被处理之前对其进行处理或修改。 2. 触发时机 过滤器和拦截器触发时机不一样&#xff0…

详解拦截器和过滤器的区别

拦截器和过滤器的区别 过滤器和拦截器的区别&#xff1a; ①拦截器是基于java的反射机制的&#xff0c;而过滤器是基于函数回调。  ②拦截器不依赖与servlet容器&#xff0c;过滤器依赖与servlet容器。  ③拦截器只能对action请求起作用&#xff0c;而过滤器则可以对几乎所…

SpringBoot 的拦截器和过滤器的区别和使用场景

Servlet 现在我们通常做 Java Web 开发都会用 SpringBoot &#xff0c;但要知道 SpringBoot 只是用来简化开发的&#xff0c;在此之前&#xff0c;Springframework 只是一个粘合剂框架&#xff0c;用来整合各种 Java Web 技术的&#xff0c;SpringMvc 都是出现的比较晚的技术&…

拦截器和过滤器的区别是什么

过滤器 过滤器Filter是基于Servlet实现。Servlet的工作原理是拦截配置好的客户端请求&#xff0c;然后对Request和Response进行处理。Filter过滤器随着web应用的启动而启动&#xff0c;只初始化一次。 过滤器的配置比较简单&#xff0c;直接实现Filter 接口就可以了&#xff…

Spring拦截器和过滤器的区别

本文来说下Spring拦截器和过滤器的区别 文章目录 概述拦截器和过滤器介绍过滤器 (Filter)拦截器 (Interceptor)主要区别 拦截器和过滤器的区别实现原理不同使用范围不同触发时机不同拦截的请求范围不同注入Bean情况不同控制执行顺序不同 本文小结 概述 拦截器和过滤器 filter和…

springboot拦截器和过滤器的区别与使用

拦截器与过滤器的区别 spring的拦截器与servlet的filter有相似之处&#xff0c;比如二者都是AOP编程思想的体现&#xff0c;都能实现权限检查、日志记录等&#xff0c;不同的是&#xff1a; 适用范围不同&#xff1a;filter是servlet规范规定的&#xff0c;只能用于web程序中…

Springboot--拦截器、过滤器 区别,作用,实现方法

Springboot–拦截器、过滤器 拦截器和过滤器的区别 拦截器不依赖于servlet容器&#xff0c;这是springMVC自带的&#xff0c;过滤器依赖于servlet容器拦截器是基于java的反射机制&#xff0c;过滤器是基于函数的回调拦截器只能对action请求起作用&#xff0c;而过滤器可以对几…

Spring Boot拦截器与过滤器的区别

Spring Boot拦截器与过滤器的区别 在使用Spring Boot开发Web应用程序时&#xff0c;您可能需要在处理请求之前或之后执行某些操作。这些操作可以包括身份验证、日志记录、性能监测等。在这种情况下&#xff0c;您可以使用两种不同的机制&#xff1a;拦截器和过滤器。本文将介绍…

Springboot过滤器和拦截器的区别

上两篇文章我们介绍了过滤器Filter和拦截器Intercepter&#xff0c;其功能都是对请求进行拦截并对请求过滤&#xff0c;本篇文章就介绍一下两者的区别 1. 过滤器和拦截器的区别 过滤器和拦截器触发时机不一样&#xff0c;过滤器是在请求进入容器后&#xff0c;但请求进入serv…

关于拦截器与过滤器使用场景、拦截器与过滤器的区别整理

拦截器与过滤器的区别总结&#xff1a; 过滤器在web.xml中配置&#xff1a; &#xff08;1&#xff09;因为一开始在过滤器中映射的url-pattern填写路径是*.action。所有的action要经过它的过滤。<url-pattern>*.action</url-pattern> &#xff08;2&#xff09;…

彻底搞清拦截器和过滤器的区别

一、引言 本来想记录一下关于用户登陆和登陆之后的权限管理、菜单管理的问题&#xff0c;想到解决这个问题用到Interceptor&#xff0c;但想到了Interceptor&#xff0c;就想到了Filter&#xff0c;于是就想说一下它们的执行顺序和区别。关于Interceptor解决权限和菜单管理的问…

Spring拦截器和过滤器的区别及详解

拦截器和filter的功能都是拦截&#xff0c;filter是在servlet前执行的&#xff0c;拦截器拦截的是Spring MVC定义的概念。过滤器中包含拦截器&#xff0c;发送一个请求&#xff0c;先进行过滤器处理&#xff0c;看程序是否受理该请求。过滤器放过后&#xff0c;程序中的拦截器再…

拦截器与过滤器的区别

文章目录 一、二者理解过滤器&#xff08;Filter&#xff09;拦截器&#xff08;Interceptor&#xff09; 二、拦截器与过滤器的区别区别&#xff1a; 三、拦截器与过滤器的触发时机拦截器与过滤器触发时机不一样 四、使用场景五、图解 一、二者理解 过滤器&#xff08;Filter…

拦截器和过滤器的区别

1、实现原理不同 过滤器和拦截器底层实现方式大不相同&#xff0c;过滤器 是基于函数回调的&#xff0c;拦截器 则是基于Java的反射机制&#xff08;动态代理&#xff09;实现的。 2、使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口&#xff0c;而这个接口是…

过滤器 和 拦截器的 6个区别,别再傻傻分不清了

周末有个小伙伴加我微信&#xff0c;向我请教了一个问题&#xff1a;老哥&#xff0c;过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊&#xff1f; 听到题目我的第一感觉就是&#xff1a;简单&#xff01; 毕竟这两种工具开发中用到的频率都相当高&#xff0c;应用起来也…

过滤器和拦截器的区别

文章目录 一、拦截器和过滤器的区别1、过滤器1、实现方式2、应用场景 2、拦截器1、实现方式2、应用场景 总结 一、拦截器和过滤器的区别 1、过滤器和拦截器触发时机不一样&#xff0c;过滤器是在请求进入容器后&#xff0c;但请求进入servlet之前进行预处理的。请求结束返回也…

过滤器和拦截器有什么区别?

过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都是基于 AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;思想实现的&#xff0c;用来解决项目中某一类问题的两种“工具”&#xff0c;但二者有着明显的差…

面试篇-Spring 拦截器和过滤器的区别?

1、实现原理不同 过滤器和拦截器 底层实现方式大不相同&#xff0c;过滤器 是基于函数回调的&#xff0c;拦截器 则是基于Java的反射机制&#xff08;动态代理&#xff09;实现的。 2、使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口&#xff0c;而这个接…

Nessus在线更新教程

前言&#xff1a;在线更新Nessus需要科学上网&#xff0c;没有工具无法更新。 1. 设置更新策略 这里选&#xff1a;更新所有的组件、频率选&#xff1a;每天&#xff0c;就可以 2. 检查是否有更新 3. 打开梯子&#xff0c;将梯子设置为全局模式 4. cmd命令行&#xff0c;进…

弱点扫描工具NESSUS详细教程

NESSUS • 家庭版 • 免费 • 专业版 • 收费、无限的并发连接 • 下载 • http://www.tenable.com/products/nessus/select-your-operating-system • 安装 • dpkg -i • 安装路径:/opt/nessus • 启动服务 • systemctl start nessusd.service • 管理地址 • https://12…