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      这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应
     */
    @Override
    public 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的包下优先级

也就是其字典顺序

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer 查询指定数据库名和表名及表结构等

查询当前数据库中所有表名&#xff0c;不用指定数据库&#xff0c;选中某数据库直接执行SQL就好 -- U:所有用户表名; S:所有系统表名;V:所有视图表名 SELECT name FROM sysobjects WHERE xtypeU OR xtypeS OR xtypeV 查询指定数据库数据库中所有表名&#xff0c; SELECT TAB…

【排序算法】归并排序

一、定义&#xff1a; &#x1f449;归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff…

精益求精测径仪颜色也是一种工艺细节

首先&#xff0c;测径仪的颜色可以作为一种视觉标识&#xff0c;提升工作效率。在复杂的生产环境中&#xff0c;不同颜色的测径仪可以迅速区分不同型号、规格或功能的设备&#xff0c;减少误操作的可能性。同时&#xff0c;通过颜色搭配&#xff0c;还可以实现设备布局的美观与…

[数据集][图像分类]煤矿分类数据集351张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;351 分类类别数&#xff1a;4 类别名称:[“Anthracite”,“Bituminous”,“…

Qt应用程序发布

一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…

一个可以自动生成随机区组试验的excel VBA小程序

在作物品种区域试验时&#xff0c;通常会采用随机区组试验设计&#xff0c;特制作了一个可以自动生成随机区组试验的小程序。excel参数界面如下&#xff1a; 参数含义如下&#xff1a; 1、生成新表的名称&#xff1a;程序将新建表格&#xff0c;用于生成随机区组试验。若此处为…

JavaScript 从入门到精通Object(对象)

文章目录 对象文本和属性方括号计算属性 属性值简写属性名称限制属性存在性测试&#xff0c;“in” 操作符“for…in” 循环像对象一样排序 总结✅任务你好&#xff0c;对象检查空对象对象属性求和将数值属性值都乘以 2 对象引用和复制通过引用来比较克隆与合并&#xff0c;Obj…

消息队列-ActiveMQ

异步技术 企业级应用中广泛使用的三种异步消息传递技术 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。原文链接&#xff1a;https://blog.csdn.net/qq_55917018/article/details/122122218 三…

创建 MFC DLL-使用关键字_declspec(dllexport)

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 从MFC DLL中导出函数的另一种方法是在定义函数时使用关键字_declspec(dllexport)。这种情况下&#xff0c;不需要DEF文件。 导出函数的形式为&#xff1a; declspec(dll…

libsystemctlm-soc项目分析

概述 libsystemctlm-soc项目是Xilinx的SystemC库。 环境安装 verilator安装 # Prerequisites: #sudo apt-get install git help2man perl python3 make autoconf g flex bison ccache #sudo apt-get install libgoogle-perftools-dev numactl perl-doc #sudo apt-get insta…

调用讯飞星火API实现图像生成

目录 1. 作者介绍2. 关于理论方面的知识介绍3. 关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1 API获取3.2 代码解析与运行结果3.2.1 完整代码3.2.2 运行结果 3.3 界面的编写&#xff08;进阶&#xff09; 4. 问题分析5. 参考链接 1. 作者介绍 刘来顺&am…

VL53L4CX TOF开发(2)----修改测距范围及测量频率

VL53L4CX TOF开发.2--修改测距范围及测量频率 概述视频教学样品申请完整代码下载测距范围测量频率硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释测量频率修改修改测距范围 概述 最近在弄ST和瑞萨RA的课程…

前端开发入门指南:掌握网页设计的第一课

UI设计与前端开发是相辅相成&#xff0c;UI设计可以视觉美化产品界面&#xff0c;而前端开发可以通过代码实现设计稿。作为UI设计师&#xff0c;如果画出来的图片美观方便对前端开发者非常有益。如果设计复比较难以实现&#xff0c;沟通就会变得更加困难。因此&#xff0c;UI设…

html+CSS+js部分基础运用14

熟悉插值{{}}的用法&#xff0c;在页面中显示下列内容。图1 插值语法的效果图 在页面中统计鼠标单机按钮的次数。【提示&#xff1a;v-on指令】&#xff0c;页面效果如下图所示&#xff1a;图2 统计效果图 3、①单击按钮可以修改黑体字。②通过调试工具vue-devtools修改黑体字。…

数据结构:并查集

数据结构&#xff1a;并查集 题目描述参考代码 题目描述 输入样例 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5输出样例 Yes 2 3参考代码 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], sz[N];int find(int x) // 返回x的祖宗节点 路径…

AI网络爬虫:用GraphQL查询爬取动态网页数据

任务&#xff1a;爬取网站www.skillshare.com搜索结果页面数据&#xff1a; 查看网站的请求信息&#xff1a; 请求网址: https://www.skillshare.com/api/graphql 请求方法: POST 状态代码: 200 OK 远程地址: 127.0.0.1:10809 引荐来源网址政策: strict-origin-when-…

Go 群发邮件Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…

实验11 OSPF协议配置

实验11 OSPF协议配置 一、OSPF单区域配置&#xff08;一&#xff09;原理描述&#xff08;二&#xff09;实验目的&#xff08;三&#xff09;实验内容&#xff08;四&#xff09;实验配置&#xff08;五&#xff09;实验步骤 二、OSPF多区域配置&#xff08;一&#xff09;原理…

44-5 waf绕过 - SQL注入绕WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装sqlilabs靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过 打开sql靶场的第一关:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 验证一下waf是否开启防…

创新指南|2024企业如何开启生成式AI创新?从5大应用场景和6步抓手

想要了解如何采用生成式AI来提高企业效率和竞争力&#xff1f;本指南将介绍如何采用生成式AI来实现数字化转型&#xff0c;并打造智能化商业模式。从5大应用场景和6大步骤切入&#xff0c;让您了解如何开启生成式AI创新。立即连线创新专家咨询或观看创新战略方案视频进一步了解…