Servle笔记(7):过滤器
1、过滤器的作用与目的
过滤器的目的
- 在客户端的请求访问后端资源之前,拦截请求
- 在服务器的响应发送回客户端之前,处理响应
2、过滤器的类型
- 身份验证过滤器(Authentication Filters)
- 数据压缩过滤器(Data compression Filters)
- 加密过滤器(Encryption Filters)
- 触发资源访问时间过滤器
- 图像转换过滤器(Image Conversion Filters)
- 日志记录和审核过滤器(Logging and Auditing Filters)
- MIME-TYPE链过滤器(MIME-TYPE Chain Filters)
- 标记化过滤器(Tokenizing Filters)
- XSL/T过滤器(XSL/T Filters)
3、过滤器部署
过滤器被部署在web.xml,映射到Servlet程序与URL中。
过滤器执行顺序是由web.xml声明的顺序决定。
web.xml
<filter><filter-name>LoginFilter</filter-name><filter-class>com.main.LogFilter</filter-class><init-param><param-name>Site</param-name><param-value>ServletTest</param-value></init-param>
</filter>
LogFilter.java
public void init(FilterConfig config) throws ServletException{String site = config.getInitParameter("Site");System.out.println("网站名称:"+site);
}
4、Servlet过滤器方法
Filter接口
//该方法在每次一个请求/响应对因客户端在链的末端请求资源而通过链传递时由容器调用。
public void doFilter(ServletRequest,ServletResponse,FilterChain)//该方法由 Web 容器调用,指示一个过滤器被放入服务。
public void init(FilterConfig filterConfig)//该方法由 Web 容器调用,指示一个过滤器被取出服务。
public void destroy()
5、Servlet过滤器实例
LogFilter.java
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;// 实现 Filter 类
public class LogFilter implements Filter {public void init(FilterConfig config) throws ServletException{// 获取初始化参数String testParam = config.getInitParameter("test-param"); // 输出初始化参数System.out.println("Test Param: " + testParam); }public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws java.io.IOException, ServletException {// 获取客户机的 IP 地址 String ipAddress = request.getRemoteAddr();// 记录 IP 地址和当前时间戳System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());// 把请求传回过滤链chain.doFilter(request,response);}public void destroy( ){/* 在 Filter 实例被 Web 容器从服务移除之前调用 */}
}
DisplayHeader.java
//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/DisplayHeader")//扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {// 处理 GET 方法请求的方法public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{// 设置响应内容类型response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String title = "HTTP Header 请求实例 - w3cschool教程实例";String docType ="<!DOCTYPE html> \n";out.println(docType +"<html>\n" +"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<table width=\"100%\" border=\"1\" align=\"center\">\n" +"<tr bgcolor=\"#949494\">\n" +"<th>Header 名称</th><th>Header 值</th>\n"+"</tr>\n");Enumeration headerNames = request.getHeaderNames();while(headerNames.hasMoreElements()) {String paramName = (String)headerNames.nextElement();out.print("<tr><td>" + paramName + "</td>\n");String paramValue = request.getHeader(paramName);out.println("<td> " + paramValue + "</td></tr>\n");}out.println("</table>\n</body></html>");}// 处理 POST 方法请求的方法public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter><filter-name>LogFilter</filter-name><filter-class>com.main.LogFilter</filter-class><init-param><param-name>Site</param-name><param-value>w3cschool在线教程</param-value></init-param>
</filter>
<filter-mapping><filter-name>LogFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<servlet> <!-- 类名 --> <servlet-name>DisplayHeader</servlet-name> <!-- 所在的包 --> <servlet-class>com.main.DisplayHeader</servlet-class>
</servlet>
<servlet-mapping> <servlet-name>DisplayHeader</servlet-name> <!-- 访问的网址 --> <url-pattern>/TomcatTest/DisplayHeader</url-pattern>
</servlet-mapping>
</web-app>
上述过滤器适用于所有的 Servlet,因为我们在配置中指定 /* 。如果您只想在少数的 Servlet 上应用过滤器,您可以指定一个特定的 Servlet 路径。
现在试着以常用的方式调用任何 Servlet,您将会看到在 Web 服务器中生成的日志。您也可以使用 Log4J 记录器来把上面的日志记录到一个单独的文件中。
设置多过滤器
<filter><filter-name>LogFilter</filter-name><filter-class>com.main.LogFilter</filter-class><init-param><param-name>Site</param-name><param-value>w3cschool在线教程</param-value></init-param>
</filter>
<filter><filter-name>AuthenFilter</filter-name><filter-class>com.main.AuthenFilter</filter-class><init-param><param-name>Site</param-name><param-value>w3cschool在线教程</param-value></init-param>
</filter>
<filter-mapping><filter-name>LogFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping><filter-name>AuthenFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
web.xml节点说明
<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
相关文章:
Servle笔记(7):过滤器
1、过滤器的作用与目的 过滤器的目的 在客户端的请求访问后端资源之前,拦截请求在服务器的响应发送回客户端之前,处理响应 2、过滤器的类型 身份验证过滤器(Authentication Filters)数据压缩过滤器(Data compressio…...
2023年:我成了半个外包
边线业务与主线角色被困外包; 012022年,最后一个工作日,裁员的小刀再次挥下; 商务区楼下又多了几个落寞的身影,办公室内又多了几头暴躁的灵魂; 随着裁员的结束,部门的人员结构简化到了极致&am…...
HTTP中GET与POST方法的区别
1. HTTP HTTP即超文本传输协议(Hyper Text Transfer Protocol),是因特网上应用最广的一种协议。 设计目的:保证客户端与服务器之间的通信(发布和接受HTML页面);工作方式:客户端-服务器端的请求-应答协议 …...
使用ChatGPT需要避免的8个错误
如果ChatGPT是未来世界为每个登上新大陆人发放的一把AK47, 那么现在大多数人做的事,就是突突突一阵扫射, 不管也不知道有没有扫射到自己想要的目标。每个人都在使用 ChatGPT。但几乎每个人都停留在新手模式。 避免下面常见的8个ChatGPT的错…...
ELK日志分析--Kibana
Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana,可以 1 搜索,观察和保护。 从发现文档到分析日志再到发现安全漏洞,Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…...
PPP点到点协议认证之PAP认证
PPP点到点协议认证之PAP认证 需求 如图配置接口的IP地址将R1配置为认证端,用户名和密码是 huawei/hcie ,使用的认证方式是pap确保R1和R2之间可以互相ping通 拓扑图 配置思路 确保接口使用协议是PPP确保接口的IP地址配置正确在R1 的端口上,…...
设计模式之建造者模式(C++)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、建造者模式是什么? 建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。 建造者模式可以…...
linux常见的系统日志
我们了解一下常见的系统日志,知道哪些需要收集 1. /var/log/boot.log linux中/var/log/boot.log是系统启动时的日志,其包括自启动服务。 2. /var/log/btmp linux中/var/log/btmp是记录登录失败信息的日志,是一种非文本文件,可以使…...
支付系统中的设计模式09:组合模式
现在就剩下怎么能够实现运营部提出的「打印出平台顾客购买的商品小票」这个需求了。 我们去超市买完东西之后,都会收到收银员打印出来的小票,就是商品清单、价格、数量和汇总的信息。下面这个我想应该99%的人都见过吧。 图三十七:超市购物小票 线上也是一样,也会有这种购物…...
Linux 文件权限之umask
目录一、文件默认创建权限二、文件默认创建权限掩码三、文件权限的修改本文主要讲解Linux中的文件默认创建权限相关的内容,涉及到的内容有:文件默认创建权限、文件默认创建权限掩码、文件访问权限的修改。 文件访问者共三类:文件所有者、文件…...
SAP ABAP 理解RAWSTRING(XSTRING) 类型
用F1查看的时候,这里是这样说的: The types RAWSTRING and STRING have a variable length. A maximum length for these types can be specified, but has no upper limit. The type SSTRING is available as of release 6.10 and it has a variable …...
Linux核心技能:2023主流监控Prometheus详解,附官方可复制中文文档教程
Prometheus既是一个时序数据库,又是一个监控系统,更是一套完备的监控生态解决方案。作为时序数据库,目前Prometheus已超越了老牌的时序数据库OpenTSDB、Graphite、RRDtool、KairosDB等,如图所示。 (来源网络࿰…...
金山文档这样玩,效率「狂飙」
1985年,微软发布了第一代的Excel。现在,Excel成为了许多打工人的必备工具,却也在很多人的日常工作中,带来了海量跨表同步、大批数据对齐的日常繁琐工作,逐渐沦为“表哥”“表妹”。多维表,是新一代数据效率…...
【类与对象】封装对象的初始化及清理
C面向对象的三大特性:封装、继承、多态。具有相同性质的对象,抽象为类。 文章目录1 封装1.1 封装的意义(一)1.2 封装的意义(二)1.3 struct 和 class区别1.4 成员属性设置为私有练习案例:1 设计…...
【算法】——并查集
作者:指针不指南吗 专栏:算法篇 🐾或许会很慢,但是不可以停下🐾 文章目录1.思想2.模板3.应用3.1 合并集合3.2 连通块中点的数量1.思想 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题…...
Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。
gif动图无损压缩1、引言2、代码实战2.1 模块介绍2.2 安装2.3 代码示例3、总结1、引言 小屌丝:鱼哥, 求助~ 求助~ 求助~ 小鱼:你这是告诉我,重要的事情 说三遍吗? 小屌丝:你可以这么理解。 小鱼:…...
文献阅读 An implementation of the seismic resolution enhancing network based on GAN
题目 An implementation of the seismic resolution enhancing network based on GAN 基于GAN的地震分辨率增强网络的实现 摘要 对于地震数据,本文利用深度学习来学习不同层次的特征并将它们合并以恢复缺失的分辨率。 将GAN网络引入到地震数据处理;对…...
Google员工说出了我不敢说的心里话!
前言:本文来自Beyond的投稿,码农翻身做了修改。今天在Medium上看到一篇文章《The maze is in the mouse》,是一个刚从Google离职的员工写的,揭开了Google内部的各种问题,引发了很多人的共鸣,到目前为止&…...
“御黑行动”进行中,三月重保单位已开放接入!
三月重保在即,对于诸多政企单位来说,正面临着特殊时期的安全保障工作这一重要“大考”。 面对越来越专业且隐匿的攻击,各单位承受着巨大压力,尤其是政府、国企、央企等具有重要地位及广泛社会影响面的单位,其网站及业务…...
taobao.top.oaid.client.decrypt( 端侧OAID解密 )
¥开放平台免费API不需用户授权 解码OAID(Open Addressee ID),返回收件人信息。该接口用于客户端直接查看订单隐私数据,解密数据不经过ISV服务器,且包含风控等安全检测。 公共参数 请求地址: HTTP地址:http://gw.api.ta…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
