JavaWeb(十二)

一、Filter概述

Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等),在访问到这些资源之前可以使用过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图

 

二、Filter快速入门

2.1、pom.xml 配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>filter-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>80</port></configuration></plugin></plugins></build>
</project>

2.2、hello.jsp 页面内容如下  

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>hello JSP~</h1>
</body>
</html>

        我们现在在浏览器输入 http://localhost/filter-demo/hello.jsp 访问 hello.jsp 页面,这里是可以访问到 hello.jsp 页面内容的。

 

2.3、编写过滤器 

其中"/*"表示对所有的路径进行拦截

@WebFilter("/*")
public class FilterDemo implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("FilterDemo...");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

重启启动服务器,再次重新访问 hello.jsp 页面,这次发现页面没有任何效果,但是在 idea 的控制台可以看到如下内容

 

上述效果说明 FilterDemo 这个过滤器的 doFilter() 方法执行了,但是在 doFilter() 方法中没有添加放行的方法 。

添加放行代码: chain.doFilter(request,response);

@WebFilter("/*")
public class FilterDemo implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("1.FilterDemo...");//放行chain.doFilter(request,response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

2.4、Filter执行流程

1、执行放行前逻辑

2、放行

3、访问资源

4、执行放行后逻辑

 2.5、代码演示

doFilter() 方法前后都加上输出语句,如下

 同时在 hello.jsp 页面加上输出语句,如下

 启动服务器访问 hello.jsp 页面,在控制台打印的内容如下:

以后我们可以将对请求进行处理的代码放在放行之前进行处理,而如果请求完资源后还要对响应的数据进行处理时可以在放行后进行逻辑处理。  

 2.5、Filter拦截路径配置

拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter 注解进行配置。如:@WebFilter("拦截路径")

拦截路径有如下四种配置方式:

1、拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截

2、目录拦截:/user/*:访问/user下的所有资源,都会被拦截

3、后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截

4、拦截所有:/*:访问所有资源,都会被拦截

2.6、过滤器链

过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。

 

 上图的执行流程如下:

1、执行 Filter1 的放行前逻辑代码

2、执行 Filter1 的放行代码

3、执行 Filter2 的放行前逻辑代码

4、执行 Filter2 的放行代码

5、访问到资源

6、执行 Filter2 的放行后逻辑代码

7、执行 Filter1 的放行后逻辑代码

2.6.1、代码演示 

编写第一个过滤器 FilterDemo ,配置成拦截所有资源

@WebFilter("/*")
public class FilterDemo implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//1. 放行前,对 request数据进行处理System.out.println("1.FilterDemo...");//放行chain.doFilter(request,response);//2. 放行后,对Response 数据进行处理System.out.println("5.FilterDemo...");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

 编写第二个过滤器 FilterDemo2 ,配置成拦截所有资源

@WebFilter("/*")
public class FilterDemo2 implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//1. 放行前,对 request数据进行处理System.out.println("2.FilterDemo...");//放行chain.doFilter(request,response);//2. 放行后,对Response 数据进行处理System.out.println("4.FilterDemo...");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

 修改 hello.jsp 页面中脚本的输出语句

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>hello JSP~</h1><%System.out.println("3.hello jsp");%>
</body>
</html>

 启动服务器,在浏览器输入 http://localhost/filter-demo/hello.jsp 进行测试,在控制台打印内容如下

从结果可以看到确实是按照2.6图中的流程执行的。

需要注意的是:

我们现在使用的是注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。  

比如有如下两个名称的过滤器 : BFilterDemoAFilterDemo 。那一定是 AFilterDemo 过滤器先执行。



三、Listener

Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

application ServletContext 类型的对象。ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象

3.1、监听器分类

JavaWeb 提供了8个监听器:

3.2、代码演示

演示 ServletContextListener 监听器

1、定义一个类,实现ServletContextListener 接口

2、重写所有的抽象方法

3、使用 @WebListener 进行配置

@WebListener
public class ContextLoaderListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {//加载资源System.out.println("ContextLoaderListener...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {//释放资源}
}

启动服务器,就可以在启动的日志信息中看到 contextInitialized() 方法输出的内容,同时也说明了 ServletContext 对象在服务器启动的时候被创建了。

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

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

相关文章

【玩转TableAgent数据智能分析】TableAgent全功能详解及多领域数据分析实践(中)不同领域数据分析实践

3 电影点评数据分析实践 利用本身自带的电影点评数据&#xff0c;来具体看一下TableAgent的分析能力&#xff0c;选择电影点评数据&#xff0c;智能体会自动导入该数据DMSC20000.csv&#xff0c;大小为3.3 MB。在数据信息展示区&#xff0c;就会显示出该数据&#xff0c;并提供…

C++STL的vector模拟实现

文章目录 前言成员变量成员函数构造函数push_backpop_backinserterase析构函数拷贝构造 前言 成员变量 namespace but {template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;}; }我们之前实…

网易有道强力开源中英双语语音克隆

项目地址&#xff08;基于PromptTTS&#xff09;&#xff1a; https://github.com/netease-youdao/EmotiVoice EmotiVoice Docker镜像 尝试EmotiVoice最简单的方法是运行docker镜像。你需要一台带有NVidia GPU的机器。先按照Linux和Windows WSL2平台的说明安装NVidia容器工具…

线上盲盒小程序,开启互联网盲盒时代

近年来&#xff0c;盲盒经济在国内非常火爆&#xff0c;各类盲盒品牌层出不穷&#xff0c;深受国内外年轻人、消费者的喜爱。 目前&#xff0c;根据数据显示&#xff0c;盲盒市场不仅在线下异常火热&#xff0c;线上盲盒也是成为了大众的新选择。各类电商平台中盲盒的成交额更…

使用node实现链接数据库并对数据库进行增删改查的后端接口

环境 node npm 编辑器 vscode 项目配置 新建目录 用vscode打开 终端输入 npm init -y npm install mysql npm install express 代码 安装好之后的代码页面 新建 在根目录新建api.js文件 const express require(express); const db require(./db/index); const app…

计算机考研408-计算机网络、操作系统整书知识点脑图

计算机网络、操作系统整书知识点脑图 今天突然想起来考研期间为了方便记忆&#xff0c;费了很大力气整理了计算机网络、操作系统两本书知识点的脑图&#xff0c;想着放着也没啥用&#xff0c;分享出来给大家看看 但是思维导图格式的东西好像没法直接发成文章&#xff0c;上传…

使用Windows10的OneDrive应用程序,让文件管理上一个台阶

这篇文章解释了如何通过在文件资源管理器和OneDrive应用程序之间轮换&#xff0c;将OneDrive与Windows 10一起使用。 使用文件资源管理器进行组织 你不必将所有OneDrive文件都保存在硬盘上&#xff0c;事实上&#xff0c;你可以将任意数量的文件留在云中&#xff08;也就是微…

SpringBoot-Swagger3

SpringBoot——2.7.3版本整合Swagger3-CSDN博客文章浏览阅读5.4k次&#xff0c;点赞6次&#xff0c;收藏17次。Swagger2&#xff08;基于openApi3&#xff09;已经在17年停止维护了&#xff0c;取而代之的是 sagger3&#xff08;基于openApi3&#xff09;&#xff0c;而国内几乎…

C++STL之List的实现

首先我们要实现List的STL,我们首先要学会双向带头链表的数据结构。那么第一步肯定是要构建我们的节点的数据结构。 首先要有数据域&#xff0c;前后指针域即可。 再通过模板类进行模板化。 然后再写List的构造函数&#xff0c;这个地方用T&,通过引用就可以减少一次形参拷…

机械中常用的一些术语

目录 一、OEMSOP:SOP编写指南 WI(标准作业指导书):标准作业程序 &#xff08;SOP&#xff09;:SOP和WI的区别&#xff1a;一、PFC、FMEA、PCP、WIPPAP、PSW&#xff1a;APQP&#xff1a;BOM&#xff08;Bill of Material&#xff09;物料清单DV&#xff08;设计验证&#xff09…

我的创作三周年纪念日

今天收到CSDN官方的来信&#xff0c;创作三周纪念日到了。 Dear: Hann Yang &#xff0c;有幸再次遇见你&#xff1a; 还记得 2020 年 12 月 12 日吗&#xff1f; 你撰写了第 1 篇技术博客&#xff1a; 《vba程序用7重循环来计算24》 在这平凡的一天&#xff0c;你赋予了它…

智能建筑市场调研:预计2028年将达到10736亿元

我国智能建筑起源于20世纪90年代&#xff0c;在我国发展了二十年&#xff0c;行业经历了初创期、规范期、发展期三个阶段&#xff0c;已经形成了产业规模及产业链&#xff0c;智能建筑工程已经普及到了各种类型建筑并延伸到了城市建设及相关行业。地域上&#xff0c;智能建筑由…

LeetCode(55)环形链表【链表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 环形链表 1.题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评…

100V降压5V芯片

高效能100V降压5V芯片&#xff1a;9V至100V输入电压范围&#xff0c;适用于各类应用 在当今的电子设备中&#xff0c;电源管理起着至关重要的作用。一款高效、稳定、可靠的电源芯片&#xff0c;是保证设备正常运行的关键。今天&#xff0c;我们为大家介绍一款性能卓越的100V降…

d2l绘图不显示的问题

之前试了各种方法都不行 在pycharm中还是不行&#xff0c;但是在anaconda中的命令行是可以的 anaconda prompt conda activaye py39 #进入f盘 F: #运行文件 python F:\python_code\softmax.py

Python数据科学视频讲解: 基本输出函数 print( )函数

2.4 基本输出函数&#xff1a;print()函数 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&…

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…

处理器的状态管理

在超标量处理器内部有两个状态, Architecture State 指令集定义的状态&#xff0c;例如通用寄存器的值、PC值以及存储器的值等&#xff1b;Speculative State 超标量处理器内部的状态,例如重命名使用的物理寄存器、重排序缓存(ROB)、发射队列(Issue Queue)和Store Buffer等部件…

Vue2与Vue3的语法对比

Vue2与Vue3的语法对比 Vue.js是一款流行的JavaScript框架&#xff0c;通过它可以更加轻松地构建Web用户界面。随着Vue.js的不断发展&#xff0c;Vue2的语法已经在很多应用中得到了广泛应用。而Vue3于2020年正式发布&#xff0c;带来了许多新的特性和改进&#xff0c;同时也带来…

Halcon参考手册语义分割和边缘提取知识总结

1.1 语义分割和边缘提取介绍 通过语义分割&#xff0c;我们使用深度学习(DL)网络将输入图像的每个像素分配给一个类。 图(1)语义分割示例 在图(1)中&#xff0c;输入图像的每个像素都被分配给一个类&#xff0c;但是苹果的三个不同实例和橘子的两个不同实例都不是可区分的对象…