JavaWeb:过滤器 Filter、监听器 Listener

news2024/11/25 21:38:28

文章目录

  • JavaWeb - 04
  • 一、Filter
    • 1. 概述
    • 2. 实现步骤
    • 3. 运行结果
  • 二、Filter 应用:实现权限拦截
    • 1. 登录步骤
    • 2. 添加的过滤器部分
    • 3. 运行结果
    • 4. 总结
  • 三、监听器
  • 注意:

JavaWeb - 04

一、Filter

1. 概述

Filter:过滤器,可以用来过滤网站的数据,例如:处理中文乱码、登陆验证等。

注意

  • 在 Web 浏览器传入的请求中可能有一些垃圾请求,此时可以用 Filter 过滤器用来过滤网站的数据
  • Filter 过滤器可以应用在客户端和 Servlet 之间、Servlet 和 Servlet/JSP 之间,并且可以通过配置信息,灵活使用过滤器
  • 必须要让过滤器继续前行,调用 doFilter 方法:filterChain.doFilter(servletRequest, servletResponse);

2. 实现步骤

实现 Filter 过滤器的步骤有三步:导入依赖、编写过滤器、在 web.xml 中进行配置。

测试:编写一个处理中文乱码的过滤器,对过滤前后的输出进行对比。

  • 创建一个普通 Maven 项目(不创建模块了),然后转换为 Web 项目(右键项目,选择 Add Framework Support...

  • pom.xml 中添加依赖

<!-- Servlet 依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

<!-- JSP 依赖 -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
</dependency>

<!-- JSTL 表达式依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- standard 标签库 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

<!-- mysql 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>
  • 编写过滤器,实现 Filter 接口(注意是:javax.servlet.Filter),重写对应的方法

  • 编写一个 Servlet,用来测试

  • web.xml 中进行配置,对过滤器 Filter 的配置与普通 Servlet 的配置类似,只要是 /filter/ 都可以经过过滤
<!-- 用于对比 -->
<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.Sun3285.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/filter/test</url-pattern>
</servlet-mapping>

<!-- 对过滤器的配置 -->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.Sun3285.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/filter/*</url-pattern>
</filter-mapping>
  • 配置 Tomcat

3. 运行结果

通过运行结果还可以看到:

  • Web 服务器启动时,过滤器就已经初始化 init 了,随时等待过滤对象出现;

  • Web 服务器关闭的时候,过滤销毁 destroy


二、Filter 应用:实现权限拦截

举例:实现用户登录,用户登陆后才能进入主页,用户注销后就不能进入主页。

思路

  1. 用户登录之后,向 Session 中存放用户的数据,相反,用户注销后,在 Session 中移除用户的数据;
  2. 可能会出现的问题:直接在地址栏中输入成功登录的 url,就可以直接访问成功登录的界面;
  3. 解决上述问题:使用过滤器:在登录之后,跳转成功页面之前走这个过滤器,判断是否有登录的这个过程,如果进行了登录,并且信息正确(此时 Session 中存放了用户的数据),就可以访问成功页面;如果直接在地址栏中输入成功登录的 url(Session 中没有用户的数据),没有权限进入。

1. 登录步骤

  • 三个 JSP 页面:登录页面、登录成功页面、登录失败页面
<%-- login.jsp:登录页面 --%>
<h1>登录</h1>
<form action="${pageContext.request.contextPath}/servlet/login" method="post">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="submit">
</form>


<%-- success.jsp:登录成功页面 --%>
<h1>登录成功,这是主页</h1>
<h2>
    <a href="${pageContext.request.contextPath}/servlet/logout">注销</a>
</h2>


<%-- error.jsp:登录失败页面 --%>
<h1>登录失败</h1>
<h2>用户名或密码错误,也可能没有权限</h2>
<h3>
    <a href="${pageContext.request.contextPath}/servlet/logout">返回重新登录</a>
</h3>

注意form表单href超链接${pageContext.request.contextPath} 表示当前项目路径

  • 登录LoginServlet.java

  • 注销(退出登录):LogoutServlet.java

  • web.xml 配置
<!-- 登录配置 -->
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.Sun3285.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/servlet/login</url-pattern>
</servlet-mapping>

<!-- 注销配置 -->
<servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>com.Sun3285.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/servlet/logout</url-pattern>
</servlet-mapping>

2. 添加的过滤器部分

为了解决用户直接在地址栏中输入成功登录的 url 就可以进入主页的问题,在登录之后,跳转成功页面之前走过滤器

  • 过滤器:LoginFilter.java

  • web.xml 可以配置使用过滤器的时间:只要路径经过 sys ,过滤器就会发生作用,进行过滤
<!-- 过滤器 -->
<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.Sun3285.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/sys/*</url-pattern>
</filter-mapping>

3. 运行结果

  • 用户名或密码错误时,跳转到登录错误页面;用户名或密码正确时,跳转到成功页面

  • 当用户不登陆,直接输入成功页面的 url 时,会通过过滤器过滤,跳转到登录错误页面

4. 总结

  • 不同的代码放入不同的包中,如可以分为 filterservletutils 包等,然后分别编写对应的代码;
  • 在编写过滤器时,需要注意,参数类型为 ServletRequest,此时需要强制转换为它的子类 HttpServletRequest,因为现在的 request 不能得到 Session;
  • 过滤时需要加一层,将需要经过过滤的代码或页面放入这一层中,通过 web.xml 配置可以保证这一层的代码或页面都会经过过滤,而其他代码或页面不会受影响。如这里加了 sys 这一层,所有经过 sys 的才都会经过过滤,其他页面不受影响;
  • 项目名是在配置 Tomcat 时设置的,对应了 web 文件夹;
  • 可以把经常使用的变量或常量单独放在一个类中,使用时通过类来调用,这样在修改时,只需要修改一次即可,如这里的常量 USER_SESSION 单独放在了 Constant 类中,使用时通过类直接调用;
  • 通过过滤器的执行过程:先通过过滤器,过滤后放行 chain.doFilter(req, resp),执行 Servlet 或 JSP 后,返回时会再次通过过滤器,此时会从 chain.doFilter(req, resp) 后开始执行,如果没有代码则不执行;
  • 出现重定向次数过多的原因:由于设置或代码问题,导致重定向循环
  • 路径问题
    • 重定向时:路径从项目名开始,即带有项目名的 url 路径
    • 请求转发时:路径是不带有项目名的 url 路径
    • JSP 页面时:路径是带有项目名的 url 路径,获取当前项目路径为:${pageContext.request.contextPath}

注意:这里的 url 路径既可以是在 web.xml 配置好的路径,也可以是 JSP 页面所在位置的路径,项目名对应了 web 文件夹。


三、监听器

步骤:编写监听器、在 web.xml 中进行配置

  • 编写监听器,实现接口(接口有很多),重写方法
// 举例
public class OnlineCountListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {}

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {}
}
  • web.xml 中进行配置
<!-- 注册监听器 -->
<listener>
    <listener-class>com.Sun3285.listener.OnlineCountListener</listener-class>
</listener>

注意:

  1. int 类型的数据不能赋值为 null,Integer 类型的数据为引用类型,可以为 null。Integer 类型的数据转换为 int 类型,可以对象调用 intValue 方法。
  2. 每一个请求都对应一个 servlet,每一个 servlet 都需要进行配置

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

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

相关文章

有用的知识又增加了:为何无法编译某些  WWDC 官方视频中的代码?

概览 作为 Apple 开发者而言&#xff0c;每期 WWDC 官方视频无疑是我们日常必看的内容。 不过&#xff0c;小伙伴们是否发现视频中有些示例代码在我们自己测试时却无法编译这一尴尬的情况呢&#xff1f; 在本篇博文中&#xff0c;我们将通过一则非常简单的示例来向大家展示为…

【Matlab】基于遗传算法的列车发车时刻(发车间隔)优化

【Matlab】基于遗传算法的列车发车时刻&#xff08;发车间隔&#xff09;优化 一、模型介绍&#xff08;一&#xff09;引言&#xff08;二&#xff09;符号定义&#xff08;三&#xff09;目标函数(四&#xff09;约束条件4.1到达乘客数量4.2乘客进站限制4.3乘客总数量&#x…

Kyligence Zen产品体验-从人找数据到数据找人

目录 前言&#xff1a; 一、什么是Kyligence Zen&#xff1f; 1、个人总结 2、官方简介 二、1分钟打开新世界大门 个人总结&#xff1a; 1、注册 2、验证登录 三、上手初体验 1、快速上手&#xff08;入门&#xff09; 2、定制化应用 四、实战体验 综述&#xff1a; 1、卡…

java transient关键字 JSON序列化问题

今天做项目的时候&#xff0c;遇到了一个奇怪的事情看图&#xff1a; 在这个JSONObject中是有这个object对象的&#xff0c;但是我输出的的却没有这个对象&#xff0c;这是怎么回事&#xff1f; 这样不明显我换一个方式去输出 我在查看了代码之后发现了我的ResponseStatus这…

数据结构-查找-树形结构(二叉排序树、二叉平衡树、红黑树、B树、B+树)查找

目录 一、二叉排序树(BST) 查询 插入 构造二叉排序树 *删除 *查找效率分析 二、二叉平衡树 *插入数据保持平衡 LL ​编辑 RR LR RL 结 *查找效率分析 删除 三、红黑树 *插入 *删除 四、B树 *插入 *删除 五、B树 一、二叉排序树(BST) 定义&#xff1a;二叉排序…

python的opencv操作记录(13)-增强之直方图均衡化

文章目录 直方图增强基本逻辑-均衡化calcHist && equalizeHistcalcHistequalizeHist 自适应直方图均衡化 前段时间忙活深度网络和android的东西去了&#xff0c;好久没讲讲传统图像处理了&#xff0c;这一篇继续来说说opencv中的传统图像处理部分——图像增强之直方图增…

【谷粒商城之订单服务-RabbitMQ延时队列】

本笔记内容为尚硅谷谷粒商城订单服务锁库存事务最终一致性部分 目录 一、RabbitMQ延时队列 二、具体实现 1、 创建上述队列和路由组件 2、解锁库存 解锁库存的两种情况 1、当订单业务提交后回滚 2、订单取消解锁库存 三、关闭订单 四、消息丢失、挤压、重复等解决方案…

c++ 继承与派生

继承就是在原有类的基础上产生新类&#xff0c;从而减少了代码重复的必要 格式&#xff1a; class A{}; class B:继承方式 A{}; 在c继承中&#xff0c;有以下几点注意 (1)基类的构造函数与析构函数不能被继承 (2)派生类对基类成员的继承没有选择权&#xff0c;不能选择继承…

c++ 常用总结(三)

1.设计模式 GitHub - FengJungle/DesignPattern: Design pattern demo code &#xff08;一&#xff09; ① 简单工厂模式 再不学简单工厂模式&#xff0c;就真的要去工厂搬砖啦~_冯Jungle的博客-CSDN博客 通过以下的例子可见&#xff0c;只需要提供产品名称作为参数&…

基于springboot+mysql+SpringDataJPA +html实现学生选课管理系统

基于springbootmysqlSpringDataJPA html实现学生选课管理系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a;4.项目需求 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 管理员&#xf…

【C++】| 03——STL | 迭代器

系列文章目录 【C】| 01——泛型编程 | 模板 【C】| 02——STL | 初识 【C】| 03——STL | 迭代器 【C】| 04——STL | 容器_vector 文章目录 1. 什么是迭代器2. 迭代器的分类3. 不同容器对应的迭代器4. 迭代器的好处5. 迭代器的操作 1. 什么是迭代器 迭代器就是指向容器内元素…

基于MATLAB的路面裂缝检测识别算法代码(GUI系统设计+图像预处理+裂缝检测)

资源地址&#xff1a; 基于MATLAB的路面裂缝检测识别算法代码&#xff08;GUI系统设计图像预处理裂缝检测&#xff09;资源-CSDN文库 主要内容&#xff1a; 1、运行Gui_Main.m程序&#xff0c;得到GUI界面 2、首先点击载入图像文件 3、后续便可以点击右侧的其他按钮进行分析…

C++linux高并发服务器项目实践 day10

Clinux高并发服务器项目实践 day10 守护进程进程组会话进程组、会话操作函数守护进程守护进程的创建步骤 线程线程和进程的区别线程之间共享和非共享资源线程操作线程创建线程退出线程参与线程分离线程取消 线程属性 守护进程 在UNIX系统中&#xff0c;用户通过终端登录系统后…

DCMM评估之战略维度沟通

01 数据战略规划过程 过程描述&#xff1a; 过程描述如下:a) 识别利益相关者,明确利益相关者的需求;b) 数据战略需求评估,组织对业务和信息化现状进行评估,了解业务和信息化对数据的需求;c) 数据战略制定,包含但不限于:1) 愿景陈述,其中包含数据管理原则、目的和目标;2) 规划…

SpringCloud 远程调用Feign、网关Gateway、配置中心Nacos、微服务架构小结、Nacos搭建集群

统一检查maven maven依赖出错的解决 注意代码格式化。因代码格式混乱&#xff0c;导致代码出错&#xff0c;pom.xml出现重复的parent标签 学习方法&#xff0c;听得懂为什么要这么做&#xff0c;要远远比 怎么做 重要的多 一、远程调用Feign 能够使用Feign进行远程调用能够…

【C++学习】创建二维动态数组

1.指针 创建二维动态数组_牛客题霸_牛客网 (nowcoder.com) 使用指针的指针 使用指针的指针可以很方便地创建动态的二维数组&#xff0c;其关键在于使用两层指针进行分配。 以下是一个动态创建n行m列的二维数组的示例代码&#xff1a; int **arr new int*[n]; // 创建一个…

深度学习训练营J2:ResNet50v2算法分析与实战

深度学习训练营J2:ResNet50v2算法分析与实战 原文链接环境介绍0.引言论文分析与解读1.ResNet50和ResNet50v2之间的结构对比2.不同结构之间的尝试 3.关于激活的不同尝试4.文章结果 ResNet50v2架构复现5.残差结构6.模块构建7.架构展示以及网络构建 8.网络结构打印ResNet50v2完整结…

Python——1

一、注释 &#xff08;1&#xff09;单行注释&#xff1a;#需要注释的内容&#xff08;#&#xff09; &#xff08;2&#xff09;多行注释&#xff1a;需要注释的内容&#xff08;三引号&#xff09; 二、变量及变量类型 1.变量 语法定义&#xff1a;变量名 变量值&#…

【小程序】微信云托管服务

链接 官方文档 云托管官网 特点 无需自提供服务&#xff0c;有云托管平台自动分配&#xff0c;并自动缩容/扩容支持多种语言及模板实例采用容器化管理方式实现服务部署支持小程序内网访问&#xff0c;仅公网测试&#xff0c;提供足够的安全防护&#xff0c;微信用户就近接入…

Python:BeautifulSoup库介绍

BeautifulSoup库介绍 1、BeautifulSoup是Python中的一个第三方库&#xff0c;其最主要的功能是处理HTML文档 ⑴查找HTML文档中的指定标签 ⑵获取HTML文档中指定标签的标签名、标签值、标签属性等 ⑶修改HTML文档中指定标签 2、BeautifulSoup库将HTML文档解析为一…