(4)Filter 和 Listen

2024-06-09 12:58
文章标签 filter listen

本文主要是介绍(4)Filter 和 Listen,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Filter

1.简介:

1.过滤器主要是对用户的请求的web资源(包括网页,图片.Servlet….)做一个过滤.已经对服务器的响应拦截过滤后再发给客户端.
2.当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例.也就是说: 当web应用跑起来的时候过滤器已经实例化.
3.该过滤器执行的顺序是按它们在部署描述符中声明的顺序。(节点的配置顺序)

2.Filter使用步骤:

  • 1.新建一个过滤器类实现 javax.servlet.Filter接口.
  • 2.在web.xml 中手动配置该filter,类似配置Servlet.
    过滤器常用的url路径: /* *.jsp

根据规范建议的各种类型的过滤器:
身份验证过滤器(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),转换 XML 内容。
常用功能:
- 设置编码
- md5加密

多重过滤器的配置顺序:
过滤器的应用顺序(先进先配置的过滤器)更改映射顺序就可以了.(先配置节点的映射先过滤)

3.具体codeDemo:

  • web.xml中配置filter:
<!-- 配置过滤器: 配置多个filter时先配置先dofilter,顺序是根据filter-mapping的配置顺序 --><filter><filter-name>FilterAll</filter-name><filter-class>cn.com.yves.filter.FilterAll</filter-class><init-param><!-- 配置该filter的初始化参数 --><param-name>filterParameter</param-name><param-value>this filter's value</param-value></init-param></filter><filter-mapping><filter-name>FilterAll</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><!-- 配置哪些请求要进过滤器;不配置dispatcher标签默认是request请求进过滤. --><dispatcher>FORWARD</dispatcher><!-- 这个例子里面配了两个dispatcher,也就是这两种请求会进过滤器:浏览器的的请求和通过request的forward转发的请求会进过滤器 --></filter-mapping><filter><filter-name>FilterAll2</filter-name><filter-class>cn.com.yves.filter.FilterAll2</filter-class><init-param><!-- 配置该filter的初始化参数 --><param-name>requestEncoding</param-name><param-value>UTF-8</param-value></init-param><init-param><!-- 配置该filter的初始化参数 --><param-name>responseEncoding</param-name><param-value>text/html;charset=UTF-8</param-value></init-param></filter><filter-mapping><filter-name>FilterAll2</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  • 对javax.servlet.Filter接口的实现
    (1)实现javax.servlet.Filter接口的第一个filter类
package cn.com.yves.filter;import java.io.IOException;
import java.util.Date;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;//servlet filter listener加载顺序与它们在 web.xml 文件中的先后顺序无关。
//最终加载顺序为: listener -> filter -> servlet
//但是某类配置节而言,与它们出现的顺序有关,比如: filter 与filter-mapping 配置节出现的顺序来依次调用 doFilter()方法的,其他类似.
/*** 当web容器启动的时候,就会自动调用init(FilterConfig arg0)来对filter进行初始化* * 当关闭web容器,关机,或者reload整个应用时 ,都会调用destroy()来关闭filter。* * 也就是说,当web容器启动时,filter就被加载到内存,并在destroy()调用之前都常驻内存。* * 总之:servlet filter listener 都是单例的,就是说在运行时只存在一个实例。* * @author Yves He* */
public class FilterAll implements Filter {// 网站浏览次数,所有的请求都算一次浏览 包括ajax局部刷新 和 错误我访问路径.private int countView;public void init(FilterConfig filterConfig) throws ServletException {/** 过滤器初始化时,* 容器自动调用该方法*/System.out.println("过滤器初始化!");String pValue = filterConfig.getInitParameter("filterParameter"); // 获取初始化参数,获取在web.xml中该filter配置的初始化参数countView = 0;}/*** 对满足该filter条件的请求,每访问一次都会先进入该方法后在进Servlet*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { /* 在这里做过滤器要做的业务 */// 注意: 如果能确保项目是基于http协议的可以将ServletRequest 强转成// HttpServletRequest类访问实例的方法;ServletResponse类推((HttpServletRequest) request).getRequestURI();System.out.println("过滤器在doFilter");System.out.println("访问次数:" + ++countView);String ipAddress = request.getRemoteAddr(); // 获取客户端ip地址System.out.println("IP " + ipAddress + ", Time "+ new Date().toString()); // 输出ip地址及当前时间// 传递请求到过滤器链,继续下一个过滤器,如果后面没有过滤器了就会 去请求web资源chain.doFilter(request, response);}public void destroy() { /* 在Filter实例在服务器上被移除前调用。 */System.out.println("过滤器 销毁了!");}
}

(2)实现javax.servlet.Filter接口的第二个filter类

package cn.com.yves.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;/*** 第二个do Filter* * @author Yves He* */
public class FilterAll2 implements Filter {/** 获取配置在改filter中的初始化参数 :分析:由于该接口总共就三个方法* ,this.方法名是不能获取初始化参数的;* 初始化参数在FilterConfig对象中*/private FilterConfig filterConfig;// 用来获取配置信息public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {String requestEncoding = this.filterConfig.getInitParameter("requestEncoding");// 获取配置在改filter中的init-name为requestEncoding的参数String responseEncoding = this.filterConfig.getInitParameter("responseEncoding");// 获取配置在改filter中的init-param的参数request.setCharacterEncoding(requestEncoding);response.setContentType(responseEncoding);chain.doFilter(request, response); // 传递请求到过滤器链,继续下一个过滤器}public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;}
}

Listen

1.简介

应用场景:
对效率要求不高的情况下(因为使用监听器,在web.xml中配置监听类的路径,实质也就是为了给虚拟机做反射用,这样效率很慢)

分类:
三大类:application(代码里是servletContext);session;request
注意: pageContext的生命周期太短了,所有没有监听器。
使用规则:

  • 写一个类实现某个监听类,覆盖其中方法.(那些方法在满足调用条件的时候,会被java虚拟机通过回调的方式回调这些方法)
  • 在web.xml中配置该监听类. (大部分要在web.xml中配置改监听类,但是也有少部分只有第一步,不需要配置了)

2.Listen具体代码

(1)application监听:
  • ApplicationListen
/**   * Filename:    ApplicationListener.java   * Copyright:   Copyright (c)2016  * Company:     Yves  * @version:    1.0    * Create at:   2016-11-20 下午4:16:39   * Description:  ** Author       Yves He */
package cn.com.yves.listen.application;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;/*** 调用机制:* * Web容器加载项目时执行contextInitialized方法,应用程序被容器销毁是执行contextDestroyed方法。* 暂时可以理解为启动和关闭容器.* * @author Yves He* */
public class ApplicationListener implements ServletContextListener {public void contextDestroyed(ServletContextEvent arg0) {// 销毁时}public void contextInitialized(ServletContextEvent arg0) {// 加载项目时//ServletContext context = arg0.getServletContext();//context.getInitParameter("param-name");//根据web.xml中<context-param>配置的参数获取值}}
  • ApplicationtAttributeListener
/**   * Filename:    ApplicationtAttributeListener.java   * Copyright:   Copyright (c)2016  * Company:     Yves  * @version:    1.0    * Create at:   2016-11-20 下午4:19:05   * Description:  ** Author       Yves He */
package cn.com.yves.listen.application;import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;/*** 调用机制:* * application.setAttribute(“userName”,”tom”); 第一次setAttribute* * application.setAttribute(“userName”,”tom”); 已经存在时setAttribute* * application.removeAttribute(“userName”);从application中移除时(也就是从servletContext中)* * @author Yves He* */
public class ApplicationtAttributeListener implementsServletContextAttributeListener {public void attributeAdded(ServletContextAttributeEvent arg0) {}public void attributeRemoved(ServletContextAttributeEvent arg0) {}public void attributeReplaced(ServletContextAttributeEvent arg0) {}}
(2)session监听

所有接口:
- ServletRequestAttributeListener
- ServletRequestListener
具体类似Application的操作.

(3)request监听

所有接口:
- HttpSessionActivationListener
- HttpSessionAttributeListener
- HttpSessionBindingListener
- HttpSessionListener
具体类似Application的操作.

这篇关于(4)Filter 和 Listen的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045247

相关文章

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

Filter基本原理和使用

https://www.cnblogs.com/xdp-gacl/p/3948353.html 一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控

在UE的内容浏览器中添加自定义的Filter

目标需求 在UE的内容浏览器中,可以使用Filter来过滤资源: 目标需求是在这之中添加一个自定义的Filter。 其代码上是非常简单的,在本文末尾。 然而我觉得找到方法的过程也是挺有意思的,因此我也记录了下来。 探索过程 1. 在哪定义? 首先,我猜测Other Filters下的各个项目,也都是通过代码添加的。因此,我调了其中一项,比如Show Redirectors,然后对代码进

Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现

什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上在网络爬虫里,一个网址是否被访问过yahoo, gmail等邮箱垃圾邮件过滤功能 这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中? 常规思路 数组链表树、平衡二叉树、TrieMap (红黑树)哈希表 虽然上面描述的

过滤器(Filter)和拦截器(Interceptor)

在Web开发中,过滤器(Filter)和拦截器(Interceptor)都是重要的组件,它们都可以对HTTP请求进行预处理、后处理以及一些额外的操作。然而,它们之间在多个方面存在明显的区别 1. 运行位置 过滤器(Filter):运行在Web服务器和Servlet容器之间的组件,可以拦截所有进出该容器的请求和响应。过滤器是Servlet规范的一部分,不依赖于特定的框架。拦截器(Intercep

使用filter改变改变地址,但又不想被本过滤器再次拦截的方法

继承HttpServletRequestWrapper重写里面的方法 如果是servlet重写getRequestURI() 如果是spring mvc重写 getServletPath()  可以根据getDispatcherType()类确定是那种调度类型,一般客户端请求action,或controller都是REQUEST,controller跳转到页面是FORWARD。

数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索

linear 功能探索 最终我们是需要使用 API 的方式,调用后端服务拉取数据填充筛选器组件,不过在探索阶段,直接用 API 方式,就需要构造 mock 数据,比较麻烦,因此先使用 Function 方式来进行功能验证。 组件初始化 新建一个页面,复制官方示例,如下: <script setup>import { ref } from 'vue'import { EverrightF

请解释Java Web中的Filter的作用和使用场景。什么是Java Web中的JSP?请解释其与Servlet的关系及各自优势。

请解释Java Web中的Filter的作用和使用场景。 Java Web中的Filter(过滤器)是一个重要的组件,它在客户端与服务器端之间扮演着关键角色。Filter的主要作用是在请求到达Servlet或JSP之前,或者响应返回给客户端之前,对请求和响应进行预处理和后处理。以下是Filter的详细作用和使用场景: Filter的作用 请求预处理:在请求到达目标资源(如Servlet、J

文件包含PHP伪协议利用方法(file,php://filter,php://input,data://,zip://,phar://)

1、file 2、php://filter 3、php://input 使用BP抓包   4、data:// 5、zip:// 6、phar://

Filter过滤器【笔记】

filter简介 1、 Filter中文意思为过滤器。顾名思义,过滤器可在浏览器以及目标资源之间起到一个过滤的作用。例如:水净化器,可以看成是生活中的一个过滤器,他可以将污水中的杂质过滤,从而使进入的污水变成净水。 2、 对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息。 3、 WEB资源可能包括Servlet、JSP、HTML