10_JavaWeb过滤器

文章目录

  • 过滤器
  • 1.过滤器的实现
    • 1.1 实现过滤器
    • 1.2 配置过滤器
      • 1.2.1 过滤器的xml方式
      • 1.2.2 过滤器的注解方式
  • 2. 过滤器的生命周期
  • 3. 过滤器链使用

过滤器

  • 生活举例: 公司前台,停车场安保,地铁验票闸机

  • java中过滤仅仅是对请求做出过滤

在这里插入图片描述

客户端向服务器发出请求,在服务器内部,相应资源之前,如上如所示;就会经过一层过滤器,过滤器做出判断,如果不能通过会将其返回,如果通过那么就正常访问服务器资源;

过滤器开发中应用的场景

  • 日志的记录
  • 性能的分析
  • 乱码的处理
  • 事务的控制
  • 登录的控制
  • 跨域的处理
  • … …

1.过滤器的实现

  • 1.1实现过滤器

    • 实现Filter接口
    • 重写过滤方法
      • 如下图所示,重写的是doFilter方法
      • doFilter请求的时候对请求做出控制,相应的时候,可以对相应的内容进行控制;
  • 配置过滤器的映射

    • web.xml
    • 注解方式

在这里插入图片描述

1.1 实现过滤器

  • doFilter相关参数
     * @param servletRequest* @param servletResponse* @param filterChain      这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应
  • 请求方面
    • 判断是否登录
    • 校验权限是否满足
  • 放行代码
      filterChain.doFilter(servletRequest,servletResponse);
  • 相应之前 做出业务简单逻辑
/*** 日志过滤器,记录请求的历史*/
public class loggingFilter implements Filter {private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/**** @param servletRequest* @param servletResponse* @param filterChain      这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//        2.写出响应前代码,需求写响应日志System.out.println("响应前");//        参数父转子/*** 参数父转子*      Httpservlet对象是Servlet对象的子对象,功能强大 我们需要获取响应的uri因此需要转用子对象进行获取*/HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse res = (HttpServletResponse)servletResponse;String requestURI = req.getRequestURI();String data = dateFormat.format(new Date());String logging = requestURI+data+ "被访问了";System.out.println(logging);//        4.求1前后的时间差long l1 = System.currentTimeMillis();//        1.如果此过滤器进行放行,可以直接调用filterChain的doFilter方法filterChain.doFilter(servletRequest,servletResponse);long l2 = System.currentTimeMillis();//        3.写出响应之后的日志System.out.println("响应之后");String afterlogging = requestURI+data+ "响应了"+(l2-l1) +"毫秒";System.out.println(afterlogging);}
}
  • 细节点
    • 响应前后时间使用System.currentTimeMillis()做差返回值为long
    • 时间日期格式化SimpleDateFormat().format(new Date)
    • doFilter中形参是ServletResponse,没有URI获取的功能,我们的一般做法是向下强转,转为功能更为强大的HttpServletResponse方法
整体代码入上所示;结果如下所示;

在这里插入图片描述

1.2 配置过滤器

1.2.1 过滤器的xml方式

  • 同Servlet配置
<!--    过滤器写法 同Servlet配置--><filter><filter-name>filter1</filter-name><filter-class>com.atguigu.filters.loggingFilter</filter-class></filter><filter-mapping><filter-name>filter1</filter-name>
<!--url-pattern 根据请求路径 指定过滤/*          匹配所有/a/*        匹配a开头所有*.html      匹配所有html后缀/Servlet1   精确匹配servlet-name 指定特定Servlet进行过滤规则一个filter-mapping可以多个url-pattern和servlet-name
--><url-pattern> /*</url-pattern><servlet-name>Servlet1</servlet-name></filter-mapping>
  • 关于路径的配置过滤器可以url-pattern或者直接写url-name都可

  • 下面写法是通过url-pattern配置 批Servlet匹配;

在这里插入图片描述

  • 如果配置Servlet-name那么此过滤照片不可用,且需要手动配置servlet-name

在这里插入图片描述

1.2.2 过滤器的注解方式

@WebFilter("/*")

在这里插入图片描述

2. 过滤器的生命周期

  • 1.构造 constorct 默认重写

  • 2.初始化 init

  • 3.过滤 doFilter (多次)

  • 4.销毁 destory

整体流程和Servlet生命周期一致

3. 过滤器链使用

  • 过滤器链的形成是tomcat自动给我们形成的

在这里插入图片描述

观察上述图,不同过滤器约束不同的资源,请求发出的时候,请求经过过滤器链的 被约束过滤器,请求走的时候 以相反的方向经过过滤器的约束路径;具体Filter优先级,是看xml文件的filter-mapping标签配置顺序;
仔细思考也能想清楚,filter-mapping关联request的url-pattern

在这里插入图片描述

如果是过滤器注解方式,其优先级是看filter的包下优先级也就是其字典顺序

在这里插入图片描述

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

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

相关文章

Jail管理器AppJail的使用@FreeBSD

Jail的简介 Jail是FreeBSD操作系统中一个功能强大的安全机制&#xff0c;自FreeBSD 4.X版本起便投入使用&#xff0c;并且随着系统的发展&#xff0c;其功能、效率、稳定性和安全性得到了持续的强化。 Jail基于chroot的概念&#xff0c;通过更改一系列程序的根目录&#xff0…

基于包围盒的机械臂防碰撞算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 5.完整工程文件 1.课题概述 基于包围盒的机械臂防碰撞算法。在实际情况中&#xff0c;由于很多对象结构较为复杂&#xff0c;当目标对象与障碍物之间的包围盒相交的时候&#xff0c;而两个物体并不相交。这就需要进一步划…

js 一维数组转多维数组

效果图&#xff1a; //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…

springboot项目中第三方jar包打包进jar包

springboot项目中&#xff0c;如果手动引入了jar包&#xff0c;打包时不会将手动引入的第三方jar包打包进价包里&#xff0c;如何处理&#xff1f; 若第三方的jar包的lib和src同级&#xff0c;则maven打包时默认不会将lib下的jar包打包进jar包&#xff0c;处理方式有两种&#…

Golang | Leetcode Golang题解之第133题克隆图

题目&#xff1a; 题解&#xff1a; func cloneGraph(node *Node) *Node {if node nil {return node}visited : map[*Node]*Node{}// 将题目给定的节点添加到队列queue : []*Node{node}// 克隆第一个节点并存储到哈希表中visited[node] &Node{node.Val, []*Node{}}// 广…

nginx --- 反向代理|负载均衡 | 动静分离

目录 反向代理如何配置 1、反向代理实例一 2、反向代理实例二 ocation 指令说明 Nginx 负载均衡 负载均衡常用算法 应用场景 总结 Nginx实现动静分离 一、什么是动静分离 二、实现方案 三、配置Nginx动静分离 四、验证测试 反向代理如何配置 1、反向代理实例一 实…

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也随之增加&#xff0c;这给存储和分享带来了不小的挑战。幸运的是&#xff0c;市面上有许多视频压缩软件…

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件&#xff0c;它集成了多种高级功能&#xff0c;为用户带来极致的视频编辑体验。在这篇文章中&#xff0c;我们将详细介绍该软件的功能和特色&#xff0c;帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…

【简单理解化】 内存函数及它的模拟实现

本文章谈论memcpy,memcmp,memmove,memset函数 目录 1.memcpy的使用和模拟实现 2.memmove的使用和模拟实现 3.memset的使用 4.memcmp函数的使用 1.memcpy的使用和模拟实现 该函数用于从源内存块复制指定数量的字节到目标内存块 1 void * memcpy ( void * destination, const voi…

【机器学习基础】Python编程01:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

C++ | Leetcode C++题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n gas.size();int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i …

2.1.3 采用接口方式使用MyBatis

实战概述&#xff1a;使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…

嵌入式Linux系统中GPIO应用控制详解

大家好,今天主要和大家分享一下,如何在linux系统上,实现GPIO口的控制,其中GPIO在内核端基本操作如下。 第一:Linux系统中GPIO介绍 GPIO(General-Purpose IO Ports),即通用I0接口.GPIO的使用较为简单,主要分为输入和输出两种功能.GPIO主要用于实现一些简单设备的控制.…

3. 使用tcpdump抓取rdma数据包

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包 目录 系列文章一、准备工作1. 源码编译tcpdump2. 安装wireshark 二、Tcpdump抓包三、Wireshark分析 一、准备工作 1. 源码编译tcpdump 使用 tcpdump…

判断经纬度是否在某个城市内

一、从高德获取指定城市边界经纬度信息 通过apifox操作&#xff1a; 二、引入第三方jar包&#xff1a; maven地址&#xff1a;https://mvnrepository.com/ maven依赖&#xff1a; <dependency><groupId>org.locationtech.jts</groupId><artifactId>…

Xcode中给UIView在xib中添加可视化的属性

给UIView在xib中添加可视化的属性 效果如下图&#xff1a; 可以直接设置view 的 borderColor 、borderWidth、cornerRadius&#xff0c;也可以单独指定view的某个角是圆角。减少了代码中的属性。 完整代码&#xff1a; UIViewBorder.h #import <UIKit/UIKit.h>inter…

NLP(1)-TF-IDF算法介绍

一、TF-IDF算法介绍 TF-IDF&#xff08;term frequency–inverse document frequency&#xff0c;词频-逆向文件频率&#xff09;是一种用于信息检索&#xff08;information retrieval&#xff09;与文本挖掘&#xff08;text mining&#xff09;的常用加权技术。 TF-IDF是一…

(十六)统计学基础练习题十(选择题T451-478)

本文整理了统计学基础知识相关的练习题&#xff0c;共50道&#xff0c;适用于想巩固统计学基础或备考的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-统计学三&#xff09;。序号之前的题请看往期文章。 451&#xff09; 452&#xff09; 453&#xff09; 4…

Ubuntu安装cuda

文章目录 前言一、安装NVIDIA驱动1.1 过程中的问题1.2 解决方法1.3 重启后出现 perform MOK management 二、安装Cuda2.1 检查是否安装显卡驱动2.2 安装Cuda2.3 验证CUDA是否安装成功 三、配置环境变量---未完2.4 图片居中加调整大学 总结 #pic_center 前言 只是为方便学习&…

如何将本地项目上传到GitHub

在软件开发过程中&#xff0c;将本地项目上传到GitHub是一个非常重要的步骤。它不仅可以帮助你备份代码&#xff0c;还可以让你与团队成员共享和协作开发。本文将详细介绍如何将本地项目上传到GitHub。 前提条件 已安装Git。如果还没有安装&#xff0c;请参考Git官网进行下载…