总结:java中过滤器和拦截器的区别?

article/2025/8/26 3:50:36

【扩展】 过滤器:Filter

概念:对目标资源的请求和响应进行过滤截取。在请求到达servlet之前,进行逻辑判断,判断是否放行到servlet;也可以在一个响应response到达客户端之前进行过滤,判断是否允许返回客户端。
场景:
(用户授权的过滤器:判断用户是否有权限请求界面)
(日志信息的过滤器:过滤用户在网站的所有请求,记录轨迹 )
(负责解码的过滤器:规定请求的解码方式)

备注:过滤器依赖于servlet,一个过滤器可以加在多个servlet上,(多个过滤器也可以加在一个servlet上)

使用Filter:
(1)实现Javax.serlvet.Filter接口(对应servlet-api.jar)

package java.filter;import javax.servlet.*;
import java.io.IOException;/*** @explain:定义过滤器* @author:jimmy* @date:2018/12/13* @create by Intellij Idea*/
public class MyFilter implements Filter {/*** 初始化* @param filterConfig* @throws ServletException*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}/*** 过滤器拦截* @param servletRequest* @param servletResponse* @param filterChain* @throws IOException* @throws ServletException*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}/*** 销毁*/@Overridepublic void destroy() {}
}

(2)配置web.xml文件(配置文件中主要有两个点:1是定义你的filter,2是定义filter拦截的地址)

 <filter><filter-name>myFilter</filter-name><filter-class>java.filter.MyFilter</filter-class></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

doFilter()为核心方法,这里定义过滤拦截规则。

【扩展】listener监听器

概念:
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
监听ServletContext对象的创建和销毁?

实现:ServletContextListener 接口,根据要求重写创建和销毁的方法。
具体代码:

package java.listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;/*** @explain:监听ServletContent对象的创建和销毁* @author:jimmy* @date:2018/12/13* @create by Intellij Idea*/
public class MyServletContextListener implements ServletContextListener {/*** 对象创建* @param sce*/public  void contextInitialized(ServletContextEvent sce) {}/*** 对象销毁* @param sce*/public  void contextDestroyed(ServletContextEvent sce) {}}

web.xml中的配置

    <!--========BY 星  IN IntelliJ IDEA 功能是: 注册对ServletContext对象创建和销毁的监听器==========--><listener><listener-class>java.listener.MyServletContextListener</listener-class></listener>

HttpSession对象的创建和销毁的监听:
具体代码:实现HttpSessionListener ,重写对应方法

package java.listener;import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;/*** @explain:HttpSeesion对象的创建和销毁监听* @author:jimmy* @date:2018/12/13* @create by Intellij Idea*/
public class MyHttpSessionListener implements HttpSessionListener {/*** 对象创建* @param sessionEvent*/@Overridepublic void  sessionCreated(HttpSessionEvent sessionEvent){}/*** 对象销毁* @param sessionEvent*/@Overridepublic  void sessionDestroyed(HttpSessionEvent sessionEvent){}
}

web.xml中的配置:

 <!--========BY 星  IN IntelliJ IDEA 功能是:注册对HttpSession对象创建和销毁的监听器 ==========--><listener><listener-class>java.listener.MyHttpSessionListener</listener-class></listener><!--========BY 星  IN IntelliJ IDEA 功能是: 配置HttpSession对象的销毁时机==========--><session-config><session-timeout>1</session-timeout></session-config>

ServletRequest对象的创建和销毁监听?

package java.listener;import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;/*** @explain:ServletRequest对象的创建和销毁监听* @author:jimmy* @date:2018/12/13* @create by Intellij Idea*/
public class MyServletRequestListener implements ServletRequestListener {public void requestDestroyed(ServletRequestEvent sre) {}public void requestInitialized(ServletRequestEvent sre) {}
}

web.xml配置:

    <!--========BY 星  IN IntelliJ IDEA 功能是: 注册对ServletRequest对象创建和销毁的监听器==========--><listener><listener-class>java.listener.MyServletRequestListener</listener-class></listener>

【扩展】interceptor拦截器

概念:
java中的拦截器是动态拦截action调用的对象。依赖于web框架,在springmvc中依赖于SpringMVC框架,在实现上基于Java的反射机制,属于AOP的一种应用,作用类似于过滤器,但是拦截器只能对Controller请求进行拦截,对其他的直接访问静态资源的请求无法拦截处理。

拦截器的使用
具体实现:实现HandlerInterceptor接口

package java.Interceptor;import org.springframework.web.servlet.HandlerInterceptor;/*** @explain:定义拦截器* @author:jimmy* @date:2018/12/13* @create by Intellij Idea*/
public class MyInterceptor implements HandlerInterceptor {//实现HandlerInterceptor中的默认方法
}

【HandlerInterceptor接口】

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.web.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

Spring 相关配置文件中配置拦截器:
mvc:interceptors



mvc:interceptor
<mvc:mapping path="/test.html"/>

</mvc:interceptor>
</mvc:interceptors>

如下图,容器是Tomcat,拦截器,过滤器,他们的关系结构
在这里插入图片描述

Java web项目的加载顺序。
web项目部署在服务器上,由客户端发起请求到部署服务器的监听端口,通过监听端口进入服务器,然后再有服务器将请求信息发送给web项目,加载web项目首先要读取web.xml文件,【web.xml中标签的读取顺序是:
““☞”“☞”“☞””,这里注意,跟这几个标签写的前后顺序没有太大的关系】,首先读取到的是和两个节点。

在这里插入图片描述

过滤器和拦截器的区别?

①:拦截器是基于java的反射机制,而过滤器基于函数回调。
②:过滤器依赖于servlet容器,拦截器不依赖于servlet容器。
③:拦截器只能对action请求起作用,而过滤器几乎对所有的请求都起作用。
④:拦截器可以访问action上下文,值栈里的对象,而过滤器不能。
⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥:拦截器可以获取IOC容器中的各个bean,而过滤器就不行,(在拦截器里注入一个service,可以调用业务逻辑)。
⑦:过滤器是在请求进入容器后,但进入servlert前进行预处理的。响应请求也是,在servlet处理结束后,返回给客户端前触发。而拦截器提供了三个方法支持(1)preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现); 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

书中的关于过滤器和拦截器的区别?
(1)使用范围不同:Filter是Servlet规范规定的,只能用于web程序中。而拦截器既可以用于web程序,也可以用于Application、swing程序中。
(2)规范不同:Filter是在servlet规范中定义的,是Servlet容器支持的,而拦截器是在spring容器内的,是spring框架支持的。
(3)使用的资源不同:同其他的代码块一样,拦截器也是一个spring的组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源,独享。例如service对象、数据源、事务管理等,通过IOC注入到拦截器即可;而Filter不能。
(4)深度不同:Filter只在Servlet前后起作用。而拦截器能深入到方法前后、异常抛出前后等。因此拦截器的使用灵活性更大。所以在Spring为基础的构架的程序中,优先使用拦截器。


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

相关文章

Java过滤器Filter使用详解

<div id"post_detail"> 转载请注明原文地址&#xff1a;http://www.cnblogs.com/ygj0930/p/6374212.html 在我的项目中有具体应用&#xff1a;https://github.com/ygj0930/CoupleSpace 过滤器 过滤器是处于客户端与服务器资源文件之间的一道过滤网&#xff0c;…

java中拦截器和过滤器详解

1 过滤器和拦截器的异同 1.1 一张图表明两者之间的差异&#xff1a; tomcat&#xff0c;filter&#xff0c;servet&#xff0c;interceptor以及controller等各种容器的关系图 1.2 两者的区别&#xff1a; 拦截器是基于java的反射机制的&#xff0c;而过滤器是基于函数回调。 …

【java】Filter过滤器

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 一、简介 Filter也称为过滤器&#xff0c;是Servlet中的一项技术&#xff0c;可以管理Web服务器管理的一系列资源&#xff0c;例如jsp,html等。Servlet API中提供了一个Filter接口&#xff0c…

[Java]过滤器(Filter)

一、什么是过滤器 过滤器是Servlet的高级特性之一&#xff0c;是实现Filter接口的Java类&#xff01; 过滤器的执行流程&#xff1a; 从上面的图我们可以发现&#xff0c;当浏览器发送请求给服务器的时候&#xff0c;先执行过滤器&#xff0c;然后才访问Web的资源。服务器响应…

Java中的过滤器Filter

本文用于学习所用&#xff0c;有不足及错误之处欢迎指出和补充。 目录 一&#xff1a;Filter简介 二&#xff1a;关于Filter &#xff08;一&#xff09;如何使用Filter进行过滤 &#xff08;二&#xff09;过滤器链 (FilterChain) &#xff08;三&#xff09;Filter的配置…

Java之过滤器

一.基本定义: 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的&#xff0c;也可以对返回的response进行拦截处理 二.新建一个Filter: 可以直接new一个Filter类.输入过滤器名称&#xff0c;跟创…

java过滤器(Filter)

目录 1 过滤器简介 2 Filter详细介绍 3 Filter的用法 3.1 用法1 3.2 用法2 1 过滤器简介 filter也称之为过滤器&#xff0c;它是javaWeb三大组件之一&#xff08;Servlet程序、Listener监听器、Filter过滤器&#xff09; 作用&#xff1a;既可以对请求进行拦截&#xff0…

Java Web之过滤器(Filter)

过滤器(Filter) 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的&#xff0c;也可以对返回的response进行拦截处理 大概流程图如下 应用场景 自动登录 统一设置编码格式 访问权限控制 敏感字符…

C#生成二维码和条形码并实现打印的功能

转载&#xff1a;https://www.cnblogs.com/xixim/p/4589078.html 下载地址&#xff1a;http://pan.baidu.com/s/1kTr3Vuf Step1&#xff1a;使用VS2010新建一个窗体程序项目&#xff1a; Step2&#xff1a;添加三个类&#xff1a;分别是BarCodeClass.cs、DocementBase.cs、im…

web项目js调用斑马打印机打印二维码

斑马打印机打印二维码 项目&#xff08;Web项目&#xff09;功能中存在生成并打印二维码的功能&#xff0c;需要借助打印机打印出二维码。由于业务需求二维码需要打印在不干胶的材料上并可以进行粘贴&#xff0c;所以借助斑马打印机通过热敏不干胶纸进行打印。 需要结合所使用…

python实现扫描二维码并打印数据

编译环境 1、操作系统&#xff1a;windows 10 2、语言&#xff1a;python 3.7.0 3、编辑器&#xff1a;pycharm-community-2018.2.8 4、需要提前安装的库&#xff1a;pyzbar、opencv-python 代码 # 首先导入本次所需要的库&#xff0c;最后一个csv是Python自带的csv表格操…

uni-app H5+ 连接蓝牙打印机打印文字及二维码

基于Native.js 实现的连接蓝牙打印机 打印效果图核心代码测试代码运行设备及环境PS&#xff1a;PPS&#xff1a;Demo 打印效果图 核心代码 /*** Description: 蓝牙打印类 基于h5 Native.js* Author: EricLee* Date: 2020-10-14 13:53:23* Param: mod* Return: $*/export cons…

5,uniapp功能之—打印机,打印文本和二维码等,(佳博的打印机)

效果图&#xff1a; 思路&#xff1a;1&#xff0c;一个打印按钮&#xff0c;2点击按钮弹窗一个蓝牙模块&#xff0c;选择蓝牙进行连接&#xff0c;连接成功就直接进行打印了&#xff0c;3&#xff0c;打印的内容自己设置 项目结构&#xff1a; 上代码&#xff0c;打印机参数…

批量生成二维码、打印

推荐使用GoodMES云标签打印&#xff0c;地址为&#xff1a;https://t.goodmes.com/home 1、登陆后点击设计与打印——>数据表 2、需要下载云标签打印 3、下载后进行登陆 4、登陆后无需管它&#xff0c;放在那运行即可 5、这个时候你的云标签助手就会现在在线状态 6、点…

electron打印条形码、二维码

功能&#xff1a;在electron打印条形码或者二维码 在百度搜索找不到合适的博客与插件&#xff0c;就在github上找到一个插件 electron-pos-printer 可以一键打印图片、文本、二维码、条形码、表格 不用安装其他多余插件&#xff0c;亲测十分好用 1、安装 npm install ele…

佳博打印机打印条码和二维码的方法

最近项目需求连接蓝牙打印机打印小票 其中小票中有条码和二维码&#xff0c;很多朋友刚接触打印接的打印逻辑&#xff0c;看不太明白&#xff0c;因此我之前给各位提供现成的打印方法&#xff1a; 关键就是安装打印的文档 提前写好各种打印的调用发放&#xff0c;直接在打印模…

【C#】简单二维码制作和打印

系列文章 【C#】条码管理操作手册 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126589496 【C#】IIS平台下&#xff0c;WebAPI发布及异常处理 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126539836 【C#】简单二维…

一维码二维码的生成及打印

VUE条形码及二维码的生成及输出到打印机 文章目录 VUE条形码及二维码的生成及输出到打印机1. 条形码的生成2. 二维码的生成3. 输出打印4. 将代码提取一下 1. 条形码的生成 安装插件 npm install jsbarcode --save github地址&#xff1a; https://github.com/lindell/JsBarcode…

C#二维码的生成及打印

窗体设计显示图 一&#xff0c;生成二维码 /// <summary>/// 生成二维码/// </summary>/// <param name"text">内容</param>/// <param name"width">宽度</param>/// <param name"height">高度</p…

生成二维码,并且打印

生成二维码&#xff0c;并且打印出来 加入依赖 //二维码依赖 npm install --save qrcodejs2 //打印依赖 npm install vue-print-nb --save在mian文件夹中使用引入并使用&#xff0c;或者按需引入 //打印依赖 import Print from vue-print-nb Vue.use(Print)本次二维码是按需引…