Javaweb11-Filter过滤器

Filter过滤器

1.Filter的基本概念:

在Java Servlet中,Filter接口是用来处理HttpServletRequest和HttpServletResponse的对象的过滤器。主要用途是在请求到达Servlet之前或者响应离开Servlet之前对请求或响应进行预处理或后处理。

image-20240711150656881

2.Filter常见的API

  • Filter接口
方法声明功能描述
void init(FilterConfig config)init( )方法是 Filter 的初始化方法,创建 Filter 实例后将调用 init( )方法。该方法的参数filterConfig 用于读取 Filter 的初始化参数(只执行一次)
void doFilter (ServletRequest req,ServletResponse resp,FilterChain cahin)doFilter()方法用于完成实际的过滤操作,当客户的请求满足过滤规则时,Servlet容器将调用过滤器的 doFiter()方法完成实际的过滤操作。doFilter( )方法有多个参数,其中,参数request和response为Web 服务器或 Filter 链中的上一个 Filter 传递过来的请求和响应对象;参数 chain 代表当前 Filter 链的对象
void destroy()该方法用于释放被 Filter 对象打开的资源,例如关闭数据库和IO 流。destroy( )方法在Web 服务器释放 Filter 对象之前被调
  • FilterConfig接口

用于封装Filter的配置信息

image-20240711151637969

  • FilterChain接口
FilterChain接口中的doFilter(ServletRequest req,ServletResponse resp)方法用来调用Filter链中下一个过滤器,如果没有过滤器调用下一个处理程序

3.Filter生命周期

init():在服务器启动之后,会创建Filter对象,调用init方法,加载配置
doFilter():每一次请求被拦截资源时会执行,执行多次
destroy():在服务器关闭后,Filter对象会被销毁,通过调用一次destroy销毁

4.Filter的配置

实现过滤器

  • @WebFilter注解

image-20240711154056819

注意:urlPatterns和value中是要过滤的url

拦截路径

1.具体资源路径:/index.jsp
2.拦截目录:/book/*
3.后缀名拦截:*.jsp
4.拦截所有资源:/*

拦截不同方式的请求

@WebFiler 注解有一个特殊的属性 dispatcherTypes,它可以指定过滤器的转发模式。dispatcherTypes属性有4个常用值,具体如下

(1)REQUEST
过滤器设置 dispatcherTypes 属性值为 REQUEST 时,如果用户通过 RequestDispatcher 对象的 include()方法或forward()方法访问目标资源,那么过滤器不会被调用。除此之外,该过滤器会被调用。
(2)INCLUDE
过滤器设置 dispatcherTypes 属性值为 INCLUDE 时,如果用户通过 RequestDispatcher 对象的 include()方法访问目标资源,那么过滤器将被调用。除此之外,该过滤器不会被调用。
(3)FORWARD
过滤器设置 dispatcherTypes 属性值为 FORWARD,如果通过 RequestDispatcher 对象的 forward()方法访问目标资源,那么过滤器将被调用。除此之外,该过滤器不会被调用。
(4)ERROR
过滤器设置 dispatcherTypes 属性值为 ERROR 时,如果通过声明式异常处理机制调用目标资源,那么过滤器将被调用。除此之外,过滤器不会被调用。
  • 在web.xml中配置
<filter><filter-name>filter01</filter-name><filter-class>com.tyut.controller.FilterText01</filter-class>
</filter><filter-mapping><filter-name>filter01</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

5.过滤器链

  • 执行顺序

如果有两个过滤器:过滤器1和过滤器2,执行顺序应为

过滤器1 -> 过滤器2 -> 资源执行 -> 过滤器2 -> 过滤器1
  • 过滤器先后顺序
1.注解配置:按照过滤器名字(filterName)的字符串比较规则比较,值小的先执行(ps:filter01比filter02先执行)
2.web.xml配置:<filter-mapping></filter-mapping>谁定义在上边,谁先执行

6.案例一:实现登录验证

实现了一个简单的登录过滤器,用于拦截所有请求并检查用户是否已登录。如果用户未登录,则会将请求重定向到登录页面;如果用户已登录,则允许访问其他页面或资源。这种过滤器在Web应用中常用于确保特定页面或功能只能被授权的用户访问,提高系统的安全性和用户体验。

package com.tyut;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebFilter({"/*"})
public class LoginFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {//1.将request转换HttpServletRequestHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;//2.判断是否是有关登录的信息String requestURI = req.getRequestURI();//如果是有关登录的页面,可以访问if (requestURI.contains("/login.jsp") || requestURI.contains("/LoginServlet") || requestURI.contains("/login.css")) {chain.doFilter(req, resp);} else {//必须登录以后才可以访问到其他页面//3.判断用户是否存在HttpSession session = req.getSession();if (session.getAttribute("user") != null) {//用户存在chain.doFilter(request, response);//放行} else {req.getRequestDispatcher("/login.jsp").forward(req, resp);}}}
}

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

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

相关文章

探展2024世界人工智能大会之合合信息扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09; &#xff0c;这次非常荣幸受邀作为专业观众参…

【常用知识点-Java】读取Properties文件

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-11 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 .properties文件是一种简单的文本文件&#xff0c;用于存储键值对&#xff0c;其每个键值对占一行&#xff0c;且键和值之间用…

力扣题解( 最长递增子序列的个数)

673. 最长递增子序列的个数 给定一个未排序的整数数组 nums &#xff0c; 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 思路&#xff1a; 用一个maxlen表示当前最长递增数组的长度&#xff0c;maxcount表示最大长度。当进下标为i的元素时&#xff0c;将…

重磅!新公司法正式实施,这些变化你必须知道! ️

新公司法来了&#xff01;企业设立和经营必知的关键变动 &#x1f3db;️&#x1f680; 大家好&#xff0c;我是猫头虎&#xff0c;科技自媒体博主。今天我们来聊聊一件大事——新公司法的实施&#xff0c;这对企业设立和经营带来了哪些重大影响&#xff1f;跟着我&#xff0c…

【DDIM】DENOISING DIFFUSION IMPLICIT MODELS【论文精读】【视频讲解】【公式推导】

论文&#xff1a;DENOISING DIFFUSION IMPLICIT MODELS&#xff08;https://arxiv.org/abs/2010.02502&#xff09; B站视频链接 DDIM论文精讲视频 去噪扩散隐模型的论文精读&#xff0c;涉及本文的大部分公式逐步推导。总计3小时的详细论文讲解。 讲解详细对应文档 DDIM视频…

聊聊mysql

记录那些坑 本文会持续更新&#xff0c;陆续更新有关mysql技术内幕、实战优化、面试技巧。 文章目录 前言索引BTree之聚集索引BTree之辅助索引BTree之联合索引BTree之覆盖索引 使用到的工具1、py_innodb_page_info工具2、hexdump工具 总结 前言 重中之重的MySql数据库 mysql…

模拟人机猜数游戏

设计目的 1、加深学生对该课程基础知识和基本理论的理解和掌握&#xff0c;培养学生综合运用所学知识独立 分析和解决问题的能力; 2、培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力&#xff0c;使学生逐步树立正 确的设计思想; 3、加强理论联系实际&#xff0c…

邦芒支招:职场高效沟通的6个秘诀

​​俗话说得好“良言一句三冬暖&#xff0c;恶语伤人六月寒。”无论在什么单位&#xff0c;社会上竟是形形色色的人等&#xff0c;人过一百&#xff0c;形形色色。每个人都想得到他人赏识、挥洒才华、争得提升。但是&#xff0c;要和陌生的人融洽相处、沟通合作&#xff0c;是…

Android 蓝牙语音通话调试

首先要清楚蓝牙语音通话属于蓝牙得哪一个协议 1、HEADSET 耳机和免提模式,用于蓝牙耳机 2、A2DP (advanced audio distribution profile)高级音频及立体声规范,包括A2DP SINK和A2DP SOURCE 3、HEALTH 健康设备规范,和一些健康设备进行通信 4、OPP (object push profi…

概率论期末速成(知识点+例题)

考试范围 一&#xff1a; 事件关系运算性质全概率公式、贝叶斯公式古典概型 二&#xff1a; 离散分布律连续密度函数性质 -> 解决三个问题&#xff08;求待定系数、求概率、求密度函数&#xff09;分布函数 -> 解决三个问题常用分布&#xff08;最后一节课的那几个分…

手电筒的光能飞到宇宙尽头吗

如果我们打开手电筒向夜空照一秒再关掉&#xff0c;我们将会看到&#xff0c;在关掉手电筒的一瞬间&#xff0c;手电筒发出的光束也会消失&#xff0c;那么&#xff0c;它发出的光哪去了呢&#xff1f;下面我们就来聊一下这个话题。实际上&#xff0c;我们看到的光束&#xff0…

Spark SQL 概述

Spark SQL 概述 Spark SQL 是 Apache Spark 的一个模块&#xff0c;专门用于处理结构化数据。它集成了 SQL 查询和 Spark 编程的强大功能&#xff0c;使得处理大数据变得更加高效和简便。通过 Spark SQL&#xff0c;用户可以直接在 Spark 中使用 SQL 查询&#xff0c;或者使用 …

ubuntu16.04安装低版本cmake(安装cmake安装)

文章目录 ubuntu16.04安装低版本cmake&#xff08;安装cmake安装&#xff09;1. **下载并解压CMake压缩文件**&#xff1a;- 首先&#xff0c;你需要从CMake的官方网站或其他可靠来源下载cmake-2.8.9-Linux-i386.tar.gz文件。- 然后在终端中使用以下命令解压文件&#xff1a; 2…

BFS:多源BFS问题

一、多源BFS简介 超级源点&#xff1a;其实就是把相应的原点一次性都丢到队列中 二、01矩阵 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:const int dx[4]{1,-1,0,0};const int dy[4]{0,0,1,-1};vector<vector<int>> updateMatrix(vector…

Makefile--自动识别编译环境(x86还是arm)进行编译

在日常工作中&#xff0c;我们会在虚拟机下的x86系统进行架叉编译&#xff0c;有时需要在arm上直接进行编译。但工程都是一样的&#xff0c;只是Makefile不一样&#xff0c;这时就涉及到Makefile的灵活运用了。以下是一个自动识别编译环境的通用Makefile&#xff1a; TARGET_A…

headerpwn:一款针对服务器响应与HTTP Header的模糊测试工具

关于headerpwn headerpwn是一款针对服务器响应与HTTP Header的模糊测试工具&#xff0c;广大研究人员可以利用该工具查找网络异常并分析服务器是如何响应不同HTTP Header的。 功能介绍 当前版本的headerpwn支持下列功能&#xff1a; 1、服务器安全与异常检测&#xff1b; 2、…

PyTorch 1-深度学习

深度学习-PyTorch 一: Pytorch1> pytorch简介2> PyTorch 特点&优势3> pytorch简史4> pytorch 库5> PyTorch执行流程6> PyTorch 层次结构二: PyTorch常用的高级API和函数1> 自动求导(Autograd)2> 模型容器(Module)3> 优化器(Optimizer)4&g…

Java Stream API详解:高效处理集合数据的利器

引言 Java 8引入了许多新特性&#xff0c;其中最为显著的莫过于Lambda表达式和Stream API。Stream API提供了一种高效、简洁的方法来处理集合数据&#xff0c;使代码更加简洁明了&#xff0c;且具有较高的可读性和可维护性。本文将深入探讨Java Stream API的使用&#xff0c;包…

QFileDialog的简单了解

ps&#xff1a;写了点垃圾&#xff08;哈哈哈&#xff09; 它继承自QDialog 这是Windows自己的文件夹 这是两者的对比图&#xff1a; 通过看QFileDialog的源码&#xff0c;来分析它是怎么实现这样的效果的。 源码组成&#xff1a; qfiledialog.h qfiledialog_p.h&#xff…

Python面试宝典第11题:最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;…