servlet过滤器原理及使用

article/2025/10/15 9:24:56

原理

首先了解什么是过滤器,各种文章已经写的很清楚了

引用来自这篇大牛的博客

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

 

提取关键字  :所有web资源    说明了过滤器的作用范围是所有web资源

过滤器是对所有web资源引用前的一层“过滤

这个“过滤”是什么意思呢,就是对一次访问进行一些预处理,比如设定字符集,权限控制,过滤敏感字符或者任何自定义的操作

原理图

过滤器是怎么实现实现的呢?

过滤器是Servlet的一个组件,是设计模式中过滤器模式(又叫责任链模式)的一种经典实现

详情查看我的另一篇文章设计模式—过滤器模式的java实现

简单来说,就是对一个请求进行一层一层的处理

/*** 请求类,模拟一次请求* 有名字和信息两个属性,根据实际情况自定义* @author tiancaixiaoniuniu* @date 2019/4/12  15:13*/
public class Request {private String name;private String info="";public Request(String name, int num) {this.name = name;this.num = num;}//一个条件数值,用来过滤条件判断private int num;//get set 略
}/*** 过滤器接口* @author tiancaixiaoniuniu* @date 2019/4/12  15:11*/
public interface Filter {/***对请求进行一次过滤或者处理* 如果继续执行后面的过滤器,返回true,否则返回false* @param request    请求类*/public boolean execute(Request request);
}/*** @author tiancaixiaoniuniu* @date 2019/4/12  15:48*/
public class Filter_A implements Filter{@Overridepublic boolean execute( Request request) {System.out.println("请求"+request.getName()+"正在执行Filter_A过滤器-----------------------");//对请求进行判断if (request!=null&&request.getNum()>10){System.out.println(request.getInfo()+"通过了Filter_A过滤器,继续执行下一个");request.setInfo(request.getInfo()+"通过了Filter_A过滤器 ");return true;}else if (request!=null){request.setInfo(request.getInfo()+"未通过了Filter_A过滤器,停止执行\n");}return false;}
}/*** @author tiancaixiaoniuniu* @date 2019/4/12  15:48*/
public class Filter_B implements Filter{@Overridepublic boolean execute( Request request) {System.out.println("请求"+request.getName()+"正在执行Filter_B过滤器-----------------------");//对请求进行判断if (request!=null&&request.getNum()>20){System.out.println(request.getInfo()+"通过了Filter_B过滤器,继续执行下一个");request.setInfo(request.getInfo()+"通过了Filter_B过滤器 ");return true;}else if (request!=null){request.setInfo(request.getInfo()+"未通过了Filter_B过滤器,停止执行\n");}return false;}
}/*** @author tiancaixiaoniuniu* @date 2019/4/12  15:48*/
public class Filter_C implements Filter{@Overridepublic boolean execute( Request request) {System.out.println("请求"+request.getName()+"正在执行Filter_C过滤器-----------------------");//对请求进行判断if (request!=null&&request.getNum()>30){System.out.println(request.getInfo()+"通过了Filter_C过滤器,继续执行下一个");request.setInfo(request.getInfo()+"通过了Filter_C过滤器 ");return true;}else if (request!=null){request.setInfo(request.getInfo()+"未通过了Filter_C过滤器,停止执行\n");}return false;}
}/*** 过滤器容器类   用来管理过滤器* @author tiancaixiaoniuniu* @date 2019/4/12  15:16*/
public class FilterContainer {private List<Filter> list=new ArrayList<>();//设置要执行的过滤器列表public void setFilterList(List<Filter> list){this.list=list;}//执行public void doFilter(Request request){for (Filter filter:list) {//如果返回false,结束执行if (!filter.execute( request)){break;}}System.out.println("执行完成!");}
}import java.util.ArrayList;
import java.util.List;/*** @author tiancaixiaoniuniu* @date 2019/4/12  16:25*/
public class Client {public static void main(String[] args) {//配置过滤器执行列表List<Filter> list=new ArrayList<>();list.add(new Filter_A());list.add(new Filter_B());list.add(new Filter_C());//加载过滤器容器FilterContainer filterContainer=new FilterContainer();filterContainer.setFilterList(list);//请求Request request1=new Request("请求1",25);Request request2=new Request("请求2",35);filterContainer.doFilter(request1);System.out.println(request1.getInfo());filterContainer.doFilter(request2);System.out.println(request2.getInfo());}
}

 

 

 

 

使用

那么我们是怎么在web中使用过滤器呢

1.实现Filter接口

 

public class FilterDemo01 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("----过滤器初始化----");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//对request和response进行一些预处理比如设置字符//可以是任何想要的自定义操作request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//继续执行剩下的过滤器chain.doFilter(request, response);  //让目标资源执行,放行}@Overridepublic void destroy() {System.out.println("----过滤器销毁----");}
}

2.web.xml中配置这个过滤器

<!--配置过滤器--><filter><filter-name>FilterDemo01</filter-name><filter-class>me.gacl.web.filter.FilterDemo01</filter-class></filter><!--映射过滤器--><filter-mapping><filter-name>FilterDemo01</filter-name><!--“/*”表示拦截所有的请求 --><url-pattern>/*</url-pattern></filter-mapping>

完成!

 

*原创作品,转载请表明出处。有建议或者问题欢迎联系我,QQ1595787997


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

相关文章

Servlet——过滤器

Servlet过滤器 什么是过滤器 过滤器是一个程序&#xff0c;它先于与之相关的Servlet页面运行在服务器上&#xff0c;但它并不是一个标准的Servlet&#xff0c;它不能处理用户请求&#xff0c;也不能对客户端生成响应。它主要用于对HttpServletRequest进行预处理&#xff0c;也…

servlet过滤器的简单使用

为什么要用过滤器或者拦截器&#xff1f; 简单来讲&#xff0c;当一个账户需要进入某个系统调用某个接口时&#xff0c;我们需要对其进行相应验证&#xff0c;否则一旦接口暴露&#xff0c;可能会造成系统崩溃。这个时候我们就需要用拦截器对调用接口一方进行身份验证。 serv…

Servlet过滤器Filter

Servlet Filter 又称 Servlet 过滤器&#xff0c;它是在 Servlet 2.3 规范中定义的&#xff0c;能够对 Servlet 容器传给 Web 资源的 request 对象和 response 对象进行检查和修改。Filter 不是 Servlet&#xff0c;不能直接访问&#xff0c;它本身也不能生成 request 对象和 r…

Servlet之过滤器

问题引入 以往的Servlet中&#xff0c;有冗余代码&#xff0c;多个servlet都要进行编写 概念 过滤器(Filter)是处于客户端于服务器资源之间的一道技术。 图示&#xff1a; 过滤器的作用 执行地位在Servlet之前&#xff0c;客户端发送请求时&#xff0c;会先经过Filter&#xff…

servlet过滤器的介绍

servlet过滤器是服务器与客户端请求与响应的中间层组件&#xff0c;它主要是用于对浏览器的请求进行过滤处理&#xff0c;并将过滤后的请求再转给下一个资源。 servlet过滤器的基本概念 Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求&#xff0c;而…

Servlet——过滤器(fiter)

什么是过滤器&#xff1f; 过滤器是Servlet的一个组件&#xff0c;是设计模式中过滤器模式&#xff08;又叫责任链模式&#xff09;的一种经典实现 是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff…

java基础篇---Servlet过滤器

Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求&#xff0c;而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件&#xff0c;在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理&#xff0c;将过滤后的请求再转给下一个资源…

mac下idea卡顿问题解决

一、背景 mac下idea卡顿 二、原因 赋予idea的内存太小了&#xff0c;需要给他更大的内存 三、解决方法 1、修改idea.vmoptions 配置文件。 help --Edit Custom VM Options 2、修改文件 这是我修改之前的&#xff1a; -Xms128m -Xmx750m -XX:ReservedCodeCacheSize512m…

macOS看视频卡顿如何修复

很多时候我们都会遇到这样一个问题&#xff1a;明明电脑很新&#xff0c;处理器内存什么的也都不差&#xff0c;但看在线视频就是卡&#xff0c;画面和音频对不上&#xff0c;令人很难受。其实这是Flash播放器开了P2P的原因。今天我就教教大家macOS看视频卡顿如何修复。 先打开…

MAC 外接键盘卡顿处理

系统偏好设置-> 键盘。 1&#xff1a;将『按键重复』调到快&#xff0c;将『重复前延迟』调到段&#xff0c;点击『更改键盘类型』,并且按照提示一步步让电脑识别键盘。 2 &#xff1a;切换『文本』&#xff0c;去勾『触控栏键入建议』&#xff0c;可以起到调优作用。

MAC如何解决idea卡顿问题

故事是这样的 我的mac配置也不是很高&#xff0c;内存大概是这样的 但是刚下载完idea后&#xff0c;简直比我之前2000块的windows本都卡。偶买噶&#xff0c;差点想直接退货。 好在控制住脾气&#xff0c;然后冷静思考后觉得&#xff0c;不该呀&#xff0c;好歹那么贵&#x…

matlab java mac_Matlab for mac卡顿、抛Java异常

在苹果上使用Matlab后&#xff0c;试用了几个版本后都十分卡顿&#xff0c;后来抛出了Java.lang.OutOfMemoryError. 后查阅资料认为可能是Matlab JVM内存不够的问题。官方给出的解决方案如下&#xff0c;将JVM内存设置到最大后&#xff0c;情况有所缓解。有时候仍然有些卡 但是…

解决 Macbook 连接蓝牙鼠标卡顿问题

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。会造成蓝牙鼠标卡顿具体解决办法如下&#xff1a; 打开“系统偏好设置”——“网络”&#xff0c;然后选择更多这里&#xff08;如图&#xff09…

优化不必要的动画,以减少Mac卡顿

本文通过两种方式来减少Mac的动画&#xff0c;友情提示&#xff1b;常重启有助于保持Mac系统正常运转。 条件允许的情况下&#xff0c;安装旧版本Mac系统、减少运行不必要的软件能优化Mac运行速度。 一、系统设置 打开系统偏好设置——>辅助功能 勾选 “减弱动态效果” …

终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移

终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移 Intel处理器机器/旧版Mac系统Apple M系列新机器 Intel处理器机器/旧版Mac系统 找到如图设置&#xff0c;修改网络首选项顺序 Apple M系列新机器 1、在系统设置里新建一个管理员用户 2、在访达-前往-电脑-磁盘-找到新建…

m1 MacBook Pro pycharm打字卡顿问题解决

一般m1芯片的MacBook Pro在pycharm中打字卡顿无非两种情况导致的&#xff0c;一种是分配给pycharm编辑器的内存太小&#xff1b;另一种是下载的版本与m1芯片版本不一致&#xff0c;不兼容导致的卡顿&#xff0c;下面文章详细记录了解决这两种情况的方法。 一、内存不足导致的卡…

Macbook Pro 鼠标卡顿问题

Macbook Pro 鼠标卡顿问题 目前无解&#xff0c;只能改善。该问题最早能追溯到 2015年。 https://jingyan.baidu.com/article/ff42efa93632c5c19e220208.html 原因 据说是无线频段冲突。 罗技低于400 的鼠标就别看了&#xff0c;白花钱。 鼠标在 macbook pro 的卡顿现象主要表现…

解决 Macbook 连接蓝牙鼠标卡顿、飘的现象

原因&#xff1a; 1. 鼠标蓝牙缺陷&#xff0c;蓝牙版本低&#xff0c;电池电量低&#xff1b; 2. 电脑性能卡顿和功能优先度&#xff1b; 3. 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。 这里以解决2和3的问题。 打开“系统偏好设置”——“网络”&#…

Mac卡顿问题处理

导读 1.文件清理 2.网络卡顿问题 文件清理 网络卡顿问题

苹果电脑mac系统运行卡顿 反应慢怎么办?

Mac电脑以生产力著称&#xff0c;卡顿几乎很少发生。但是随着日常的使用&#xff0c;系统空间越来越多&#xff0c;随之而来的问题就是存储空间不足&#xff0c;无法保存文件。如果mac同时运行的软件过多&#xff0c;也会造成卡顿&#xff0c;所以mac电脑并不是不会卡顿&#x…