day20 过滤器和监听器

news2024/9/21 2:42:25

过滤器Filter

作用:对请求和响应进行预处理

使用场景:字符编码处理,登录检验,敏感词过滤,前端框架分发器

Filter的开发步骤

filter也是一个web组件,结构和servlet相似

1.定义类:实现javax.servlet.Filter接口

2.覆盖里面的3个方法:

innit:初始化

doFilter:对请求和响应进行预处理

destroy:对象销毁

3.使用web.xml配置文件或者注解的方式交给tomcat进行管理

web.xml配置文件的格式(可用于解决硬编码的时候使用):

<!--将过滤器交给tomcat管理-->
<filter>
    <filter-name>HelloFillter</filter-name>
    <filter-class>cn.wolfcode.fillter._01_hellow.HelloFillter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HelloFillter</filter-name>
    <!--请求哪些资源时要经过当前过滤器,只针对访问关于hello的资源的时候进行过滤-->
    <url-pattern>/hello</url-pattern>
</filter-mapping>

注解的方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImvGT1IL-1684933883183)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423185747917.png)]

Fillter配置文件的执行顺序(过滤器链):

xml:按照mapper的的先后顺序进行先后过滤

注解:按照注解的字母先后顺序进行优先级的过滤

过滤路径:

**servlet中的url-parttern:**给当前的资源起一个别名,外界可以通过这个别名进行访问

**Fileter中的url-partern:**指定里面的哪些资源需要进行过滤

/hello:对/hello中的资源进行过滤

/hello/*:对/hello下的所有资源进行过滤

/*:对根下面的所有资源进行过滤

Filter的生命周期:

对象的创建:启动服务器的时候进行创建,一次

innit方法执行:启动服务器的时候执行innit方法,一次

doFilter方法的执行:每次请求对应的资源都会执行,n次

destory方法的执行:正常关闭服务器的时候销毁,0或者1次

过滤方式的设置


 <filter-mapping>
        <filter-name>Filter3</filter-name>
        <url-pattern>/*</url-pattern>
 //新的请求经过过滤器
		<dispatcher>REQUEST</dispatcher>
//请求转发
		<dispatcher>FORWARD</dispatcher>
//错误页面跳转
		<dispatcher>ERROR</dispatcher>
    </filter-mapping>

字符编码过滤器

**作用:**对servlet中的字符编码进行处理,解决重复代码问题,在过滤的时候就进行处理

方式一:在文件中写死编码的格式

1.创建一个doFileter,并设置字符编码的格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txRWEVyJ-1684933883184)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423193013465.png)]

2.配置web.xml文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvJ3yTkK-1684933883185)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423193313355.png)]

由于上一中的编码在java代码中已经写死了,造成了硬编码的问题,所以使用方式二进行编码的配置

方式二:在web.xml配置文件中配置编码

在filter中进行配置,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNVRc65f-1684933883186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423194347692.png)]

只有在innit方法中才可以从filteConfig对象中获取配置的encoding初始化参数,并在doFilter方法中进行使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NRHWkqvn-1684933883186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423201030773.png)]

字符编码覆盖设置

由实际的条件控制是否进行编码的设置,

1.前面的过滤器没有设置,此时需要设置

2.如果当前过滤器的编码是强制执,此时需要设置

首先xml中必须的有字符的设置,才能进行编码的覆盖

web.xml中的配置如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qh9TxBG4-1684933883187)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423201455830.png)]

写一个工具类进行判断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5R3cYBq-1684933883188)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423202958109.png)]

需要在从初始化方法中的filterconfig对象中获取force的初始值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KiGv6TVw-1684933883189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230423205016043.png)]

登录校验过滤器

将登录校验的过滤器使用使用了重复代码

创建一个CheckLoginFilter,使用过滤器进行判断用户是否进行登录

监听器

是web组件之一

**监听的对象:**作用域对象,作用域属性

**监听的动作:**作用域对象的创建和销毁,作用域属性值的改变.

监听器分类:

作用域对象分:

ServletRequestListener

HttpSessionLitener

ServiceContextListener

按作用域属性分:

ServletRequestAttrubuteListener

HttpSessionAttrubuteListener

ServiceContextAttrubuteListener

开发步骤

**1.**创建一个xxLisener的类,实现对应的接口

是:javax.servlet.http下的接口

**2.**实现里面的方法(统计游客数量)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-89AZSIg8-1684933883189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424200955137.png)]

**3.**将监听器交给tomcat管理

(1)配置web.xml

一般习惯将listener配置在第一个位置

<listener>
    <listener-class>cn.wolfcode.listener.VisiterListener</listener-class>
</listener>

(2)注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6UNBJb8r-1684933883190)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424201205699.png)]

创建默认管理员

在启动服务器的时候使用监听器进行创建

1.先出查询账户是否存在管理员账号

2.如果没有账号就在创建一个监听器中并在里面创建一个默认账号

@WebListener
public class CreadAdminListener implements ServletContextListener {
    private IUserDAO dao=new UserDAOImpl();

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
      User user=  dao.selectByName("admin");
      if(user==null){
          //保存管理员账号
          User user1 = new User();
          user1.setUsername("admin");
          user1.setPassword("123");
          dao.insert(user1);
      }
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}

分页查询

假分页:将查询的所有结果方法 内存中,数据过多荣誉造成内存溢出

真分页(开发使用):每一次翻页都从数据库中查询数据

效果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfEGZIAS-1684933883191)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424220117392.png)]

由于数据量较多,此时将所有的数据进行封装到一个对象里面进行共享

分页的步骤

1.分析分页需要哪些数据,单独使用一个包来装

通过SQL语句查询的结果两个

List<?> list , 数据库中所有的结果集,展示在列表里面

totalCount, 统计有多少条数据

用户输入的两个数据:

pageSize, 每页展示多少条数据,用户可选择

currentPage, 当前页,即跳转到第几页

通过计算得到的三条数据:

totalPage=totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize, 总页数

prevPage=currentPage>0?currentPage-1:1: 上一页

nextPage=currentPage<toltalPage?currentPage+1:totalPage. 下一页

2.将分页的数据在PageResult做成一个构造器,用于创建对象用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulyEWOwS-1684933883192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230424222340522.png)]

3.可以看见上面的分页只需要传4个参数(结果集,总数据条数)就可以获得所有的数据,service直接new对象就可以对结果进行计算,但是dao需要通过查询得到结果集和总条数,在搞一个类,同时将limit的第一个参数进行计算来进行传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kG2lgTwY-1684933883192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073216840.png)]

sql 语句书写如下,查两条数据就行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOYdAA3q-1684933883193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073404935.png)]

dao层实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mAYGnZcg-1684933883194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073452677.png)]

service中的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnuBAWou-1684933883194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073604664.png)]

在servlet中传递用户所传递的参数即可,并将数济进行共享

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oY6CCjSB-1684933883195)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425073942753.png)]

在jsp中使用连接的方式进行页面的跳转,用min和max设置页数的大小,没一页的跳转通过表单提交的方式进行,复选框的默认使用的是"selected",单选框使用的是"checked"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjJBJStM-1684933883196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230425074304895.png)]

过滤查询:

使用最开始的的数据库的sql查询语句进行查询会进行sql语句的拼写,比较繁琐,此时需要使用mybaties自带的标签来进行过滤语句的拼接,根据用户传递的参数,拼接where条件

1.创建一个类接收过滤查询的条件,同时继承分页查询,减少重复代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMzUetwA-1684933883196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427071048457.png)]

2.使用where标签进行多条件拼接,他可以将第一个and或者or关键字进行替换到层的代码没有改变,由于两条查询语句中的条件差不多,可以使用xxx将查询条件进行统一,使用concat函数与%完成字符串模糊查询的需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGjGzHvz-1684933883197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427071846880.png)]

3.在查询条件中使用进行标签的调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sfc76TnM-1684933883197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427072053085.png)]

4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVb2LCSD-1684933883198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427072424614.png)]

5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugAjDMU5-1684933883198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427073055937.png)]

3.在查询条件中使用进行标签的调用

4.service层里面需要给selectForCount进行传参保证分页与过滤能同时进行

5.解决翻页数据丢失问题,翻到最后一页是没有数据的,此时使用jsp来解决数据丢失问题,为页面跳转增加id属性进行控制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGGYZU2g-1684933883199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230427073126164.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程池C和C++实现

一、线程池介绍 1&#xff09;应用场景 当并发数很多的时候&#xff0c;并且每个线程执行时间很短的任务&#xff0c;这样就会频繁创建线程&#xff0c;而这样的频繁创建和销毁线程会大大降低系统的执行效率。对于这种场景我们可以使用线程池来复用之前创建的线程&#xff0c…

Java 与排序算法(7):堆排序

一、堆排序 堆排序是一种基于比较的排序算法&#xff0c;它的基本思想是将待排序的元素构建成一个堆&#xff0c;然后依次将堆顶元素取出&#xff0c;放到已排序的序列中&#xff0c;直到堆中所有元素都被取出&#xff0c;最终得到一个有序的序列。 堆是一种特殊的树形数据结…

5.24 基础题目

快速幂 #include<bits/stdc.h> using namespace std; //126348976 982638476 938420413 int main(){int a,b,p;cin>>a>>b>>p;long long res 1,ci1;int flag0;if(b0){res%p;}else{while(b){if (flag0)cia%p;elseci(ci%p)*(ci%p)%p;if (b&1)res(res…

【学习随笔】

2022/11/13 HTML :讲完了 css&#xff1a;讲完了 作业&#xff1a;编写登陆界面、整理一下sql优化,对于mybatis不熟练的继续练习 关于MySQL优化的问题? 思路总结&#xff1a;主要考虑数据库优化与SQL语句优化。 1&#xff0c;数据库优化&#xff0c;包括存储引擎的优化&…

FreeRTOS:时间管理

目录 前言一、FreeRTOS 延时函数1.1函数vTaskDelay()1.2 函数prvAddCurrentTaskToDelayedList()1.3 函数vTaskDelayUntil() 二、FreeRTOS 系统时钟节拍 前言 在使用FreeRTOS 的过程中我们通常会在一个任务函数中使用延时函数对这个任务延时&#xff0c;当执行延时函数的时候就…

【C/C++】内存管理

【C/C】内存管理 目录 【C/C】内存管理C/C内存分布C语言和C中动态内存管理方式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数operator new与operator delete的类专属重载new和delete的实现原理定位new表达式(placement-new)重要的知识ma…

Docker(1)

一)什么是虚拟化&#xff1f;容器化&#xff1f; 1)物理机:实际的服务器或者计算机&#xff0c;相对于虚拟机而言的对实体计算机的称呼。物理 机提供给虚拟机以硬件环境&#xff0c;有时也称为“寄主”或“宿主&#xff1b; 2)虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台…

【C++】——string类的介绍及模拟实现

文章目录 1. 前言2. string类的常用接口2.1 string类对象的常见构造2.2 string类对象的容量操作2.3 string类对象的访问及遍历操作2.4 string类对象的修改操作2.5 string类非成员函数2.6 string四种迭代器类型2.7 string类的insert和erase函数 3. 浅拷贝和深拷贝4. string类模拟…

评奖系统设计

系列文章 任务40 评奖系统设计 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试执行完毕程序展示成功&#xff01;学生投票&#xff0c;举例第一…

URP的多Pass和Features用法

回到目录 大家好&#xff0c;我是阿赵。这里用一个传统的描边例子来说明一下&#xff0c;URP下怎么使用多Pass和Features。 一、传统多Pass描边 最常用的制作描边方法&#xff0c;就是写多一个Cull Front的Pass&#xff0c;然后通过法线方向扩展顶点&#xff0c;模拟描边的效…

机试打卡 -05 接雨水(动态规划栈)

我的思路&#xff1a;依次计算每一列能接收的雨水量。 关键点&#xff1a;如何计算得到每一列所能接收到的雨水量&#xff1f; 某一列能够接收到的雨水量&#xff0c;取决于其左右两侧最高的柱子。仅有当左右两侧的柱子均高于该列的高度&#xff0c;该列才可收到雨水&#x…

Java 17 VS Java 8: 新旧对决,这些Java 17新特性你不容错过

&#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; Java是一门非常流行的编程语言&#xff0c;由于其跨平台性、可移植性以及强大的面向对象特性而备受青睐。Java最初由Sun Microsystems公司于1995年推出&#xff0c;随着时间的推…

[极客大挑战 2019]HardSQL1

拿到题目是一个登录界面 提交万能密码后拿到回显信息&#xff0c;说明页面存在过滤 burp抓包爆破后发现&#xff0c;所有736都是被过滤字符 联合注入和时间盲注被过滤&#xff0c;因为页面存在报错信息&#xff0c;所以尝试报错注入 因为空格也被过滤&#xff0c;所以我们使用括…

HOMER docker版本配置优化

概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具。 HOMER是一款强大的、运营商级、可扩展的数据包和事件捕获系统&#xff0c;是基于HEP/EEP协议的VoIP/RTC监控应用程序&#xff0c;并可以使用即时搜索、处理和存储大量的信令、RTC事件、日志和统计信息。 …

机器学习-01概论

人们在生活中可能已经注意到了这样一种现象&#xff1a;我们能够轻松地通过相貌区分出日本人、韩国人和泰国人&#xff0c;但是面对英国人、俄罗斯人和德国人时&#xff0c;我们却很难辨认他们的面孔。造成这种现象的原因一方面是因为日韩泰都是我国的邻国&#xff0c;我们观察…

信号处理与分析-确定性信号的分析

目录 一、引言 二、确定性信号的定义 三、确定性信号的分类 四、确定性信号的分析方法 4.1 傅里叶变换 4.2 离散傅里叶变换 4.3 离散余弦变换 4.4 小波变换 五、确定性信号的处理方法 六、结论 一、引言 信号分析与处理是现代通信技术和信息处理技术的重要组成部分。…

Redis安装及其配置文件修改

一、redis 安装 点击即可下载 https://download.redis.io/releases/ 将下载后的包通过xftp上传到服务器 解压&#xff0c;我这边是解压到/usr/local目录下 -- 创建路径 mkdir /usr/local/redis -- 解压 tar -zxvf redis-4.0.0.tar.gz -C /usr/local/redis 为防止编译失败&am…

MyBatis-Plus精讲和使用注意事项

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

【国产虚拟仪器】基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(一)总体设计

2.1 引言 本课题是来源于雷达辐射源识别项目&#xff0c;需要对雷达辐射源中频信号进行采集传输 和存储。本章基于项目需求&#xff0c;介绍采集卡的总体设计方案。采集卡设计包括硬件设计 和软件设计。首先对采集卡的性能和指标进行分析&#xff0c;接着提出硬件的总体设计…

详解知识蒸馏原理和代码

目录 知识蒸馏原理概念技巧举例说明KL 散度及损失 KD训练代码导入包网络架构teacher网络student网络 teacher网络训练定义基本函数训练主函数 student网络训练&#xff08;重点&#xff09;理论部分定义kd的loss定义基本函数训练主函数 绘制结果teacher网络的暗知识softmax_t推…