Java_Filter过滤机制详解
- 格式:doc
- 大小:75.00 KB
- 文档页数:9
javafilter用法Java中的Filter是一种创建和处理HTTP请求和响应的机制。
它可以拦截请求和响应,并在处理前后对其进行修改。
这个机制是通过两个接口实现的:Filter接口和FilterChain接口。
接下来将详细介绍Filter 的用法。
Filter接口是javax.servlet包中的一个接口,它定义了一个方法doFilter(,可以用来处理请求和响应。
该方法有三个参数:ServletRequest、ServletResponse和FilterChain。
ServletRequest对象封装了请求的信息,ServletResponse对象封装了响应的信息,FilterChain对象用于管理Filter的链。
当调用doFilter(方法时,Filter可以修改ServletRequest和ServletResponse对象,并且可以选择将请求传递给下一个Filter或目标资源。
Filter的主要作用有:1. 请求过滤:可以拦截并检查请求的参数、URL、请求头等信息,实现权限控制、防止攻击、记录日志等功能。
例如,可以使用Filter来检查用户是否有权限访问一些URL,如果没有则返回错误页面。
2. 请求增强:可以增强请求的功能,如添加额外的请求头、请求参数,对请求进行加密、压缩等操作。
例如,可以使用Filter来对请求参数进行加密,在传输过程中增强安全性。
3. 响应过滤:可以拦截并检查响应的内容,如对响应进行过滤、压缩、重定向等操作,实现内容修改、响应优化等功能。
例如,可以使用Filter来对响应内容进行压缩,减少网络带宽的占用。
下面是一个简单的Filter示例:```javaimport javax.servlet.*;import java.io.IOException;public class MyFilter implements Filterpublic void init(FilterConfig filterConfig) throws ServletException// 在Filter初始化时执行的逻辑,可以获取配置信息等}public void destro// 在Filter销毁时执行的逻辑,可以释放资源等}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException//在处理请求前的逻辑System.out.println("Before Filter");// 继续执行下一个Filter或目标资源的逻辑chain.doFilter(request, response);//在处理响应后的逻辑System.out.println("After Filter");}```上述示例中的MyFilter类实现了Filter接口,并重写了init(、destroy(和doFilter(方法。
Java过滤器Filter使⽤详解<div id="post_detail">转载请注明原⽂地址:在我的项⽬中有具体应⽤:https:///ygj0930/CoupleSpace过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹,在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应。
如图,浏览器发出的请求先递交给第⼀个filter进⾏过滤,符合规则则放⾏,递交给filter链中的下⼀个过滤器进⾏过滤。
过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。
当请求通过了链中所有过滤器后就可以访问资源⽂件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
在doFilter()⽅法中,chain.doFilter()前的⼀般是对request执⾏的过滤操作,chain.doFilter后⾯的代码⼀般是对response执⾏的操作。
过滤链代码的执⾏顺序如下:过滤器⼀般⽤于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重⽤,不必每个servlet中还要进⾏相应的操作。
下⾯是过滤器的简单应⽤:1:创建过滤器如图,新建⼀个class,实现接⼝Filter(注意:是javax.servlet中的Filter)。
2:重写过滤器的doFilter(request,response,chain)⽅法。
另外两个init()、destroy()⽅法⼀般不需要重写。
在doFilter⽅法中进⾏过滤操作。
常⽤代码有:获取请求、获取响应、获取session、放⾏。
剩下的代码就是根据session的属性进⾏过滤操作、设置编码格式等等了,看情况⽽定。
HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象HttpSession session=request.getSession();//获取session对象过滤操作代码......chain.doFilter(request, response);//放⾏,通过了当前过滤器,递交给下⼀个filter进⾏过滤3:在web.xml中配置过滤器。
Java过滤器Filter的原理及配置_学习笔记
Filter中⽂意思为过滤器。
顾名思义,过滤器可在浏览器以及⽬标资源之间起到⼀个过滤的作⽤。
例如:⽔净化器,可以看成是⽣活中的⼀个过滤器,他可以将污⽔中的杂质过滤,从⽽使进⼊的污⽔变成净⽔。
对于WEB应⽤来说,过滤器是⼀个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息。
WEB资源可能包括Servlet、JSP、HTML页⾯等
创建⼀个新的Filter⽂件
配置web.xml⽂件、Filter的配置和Servlet的配置很像,但是Filter的<url-pattern>,下⾯是精确拦截:指定具体的拦截路径,也可以*.jsp:拦截所有的jsp⽂件或者/web/*:拦截web⽂件下的所有⽂件。
在doFilter中chain.doFilter是放⾏的意思
当有多个Filter过滤时,在web.xml中<url-pattern>的配置前后决定了过滤执⾏的先后顺序。
Filter的⽣命周期和Servlet类似
构造器:创建Filter实例是调⽤,Filter实例服务器⼀旦启动就会被创建
init():实例创建后马上被调⽤,⽤来对Filter做⼀些初始化的操作
doFilter():Filter的主要⽅法,⽤来完成过滤器主要功能的⽅法,每次访问⽬标资源时都会调⽤。
destroy():服务器停⽌时调⽤,⽤来释放资源。
Java过滤器Filter详解⽬录Filter学习Filter功能Filter的⼯作原理多个Filter的实现Filter的执⾏逻辑总结Filter学习Filter功能拦截jsp、静态图⽚⽂件、静态html资源⽂件实现URL级别的权限访问控制过滤敏感词汇压缩相应信息Filter的⼯作原理看源码可以看出来,Filter接⼝中有3个⽅法:init、doFilter、destoryinit⽅法,初始化Filter,Filter在服务器启动阶段被实例化。
并且调⽤init⽅法,init⽅法只执⾏⼀次,因为Filter只被实例化⼀次。
destory⽅法也好理解,就是销毁Filter,释放内存,在运⾏结束时调⽤此⽅法当。
长时间没有⽤户访问,或者项⽬重新部署,或者服务器重新启动的时候,会销毁所有的Filter对象,销毁之前会先调⽤Filter对象的destroy⽅法,完成销毁前的准备⼯作。
也是只执⾏⼀次。
doFilter⽅法提供给开发者重写过滤逻辑。
多个Filter的实现public class AFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("输出filter2的init⽅法");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) servletResponse;HttpServletRequest request = (HttpServletRequest) servletRequest;System.out.println("输出filter2的doFilter⽅法之前");filterChain.doFilter(request, response);System.out.println("输出filter2的doFilter⽅法之后");}@Overridepublic void destroy() {System.out.println("输出filter2的destroy⽅法");}}public class BFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("输出filter1的init⽅法");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) servletResponse;HttpServletRequest request = (HttpServletRequest) servletRequest;System.out.println("输出filter1的doFilter⽅法之前");filterChain.doFilter(request, response);System.out.println("输出filter1的doFilter⽅法之后");}@Overridepublic void destroy() {System.out.println("输出filter1的destroy⽅法");}}配置Filter的过滤顺序,通过setOrder⽅法执⾏FilterChain的顺序,数字越⼩,优先级越⾼。
java-过滤器Filter_多个Filter的执⾏顺序【Filter链】*在⼀个web应⽤中,可以开发编写多个Filter,这些Filter组合起来称为⼀个Filter链。
*web服务器根据Filter在web.xml中的注册顺序,决定先调⽤哪个Filter,当第⼀个Filter的doFilter⽅法被调⽤时,web服务器会创建⼀个代表Filter链的FilterChain对象传递给该⽅法,在doFilter⽅法中,开发⼈员如果调⽤了FilterChain对象的doFilter⽅法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调⽤第⼆个filter,如果没有,则调⽤⽬标资源。
【⼯程截图】设计了两个Filter和⼀个Servlet,访问Servlet时,查看Filter的执⾏顺序。
【web.xml】<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" <display-name>FilterDemo01</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 过滤顺序:谁的写在上⾯,谁先被过滤 --><filter><filter-name>FilterTest01</filter-name><filter-class>com.Higgin.web.filter.FilterTest01</filter-class></filter><filter-mapping><filter-name>FilterTest01</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping><filter><filter-name>FilterTest02</filter-name><filter-class>com.Higgin.web.filter.FilterTest02</filter-class></filter><filter-mapping><filter-name>FilterTest02</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping></web-app>【FilterTest01.java】package com.Higgin.web.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;public class FilterTest01 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest01 执⾏前---");chain.doFilter(request, response);//让⽬标资源执⾏,即:放⾏System.out.println("FilterTest01 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【FilterTest02.java】package com.Higgin.web.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;public class FilterTest02 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest02 执⾏前---");chain.doFilter(request, response); //放⾏System.out.println("FilterTest02 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【ServletTest01.java】package com.Higgin.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class ServletTest01*/@WebServlet("/ServletTest01")public class ServletTest01 extends HttpServlet {private static final long serialVersionUID = 1L;public ServletTest01() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.getWriter().write("中国加油!China Come on!");System.out.println("执⾏ServletTest01---");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response);}}【运⾏结果】在浏览器中输⼊:http://localhost:8080/FilterDemo01/ServletTest01查看控制台输出结果⾃⼰可以尝试分别注释FilterTest01和FilterTest02中的chain.doFilter⽅法,⽤Junit查看具体的执⾏过程。
java的filter方法Java的filter方法介绍在Java中,我们经常会遇到需要对集合进行筛选操作的情况。
Java的filter方法就是为了解决这个需求而提供的一个重要的工具。
本文将详细说明Java的filter方法的使用方法和各种变种。
Java的filter方法Java的filter方法可以通过给定一个条件判断函数,过滤出符合条件的元素,得到一个新的集合。
基本语法Stream<T> filter(Predicate<? super T> predicate)参数说明•predicate: 一个判断函数,用于决定元素是否满足条件,返回true表示满足条件,被保留,返回false表示不满足条件,被过滤。
返回值•一个新的Stream,其中包含满足条件的元素。
使用示例以下是一个简单的示例,演示了如何使用filter方法筛选出偶数:List<Integer> numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9,10);List<Integer> evenNumbers = ().filter(n -> n % 2 == 0).collect(()); (evenNumbers); // 输出: [2, 4, 6, 8, 10]进一步了解变种1:使用多个条件当我们需要同时满足多个条件时,可以使用多个filter方法串联使用。
每个filter方法用于筛选出满足一个条件的元素。
List<Integer> numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9,10);List<Integer> filteredNumbers = ().filter(n -> n % 2 == 0).filter(n -> n > 5).collect(()); (filteredNumbers); // 输出: [6, 8, 10]变种2:使用自定义条件判断函数除了使用lambda表达式作为条件判断函数外,还可以使用自定义的方法或函数作为条件判断函数。
javaweb——Filter(过滤器)学习一、Filter简介Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter 技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态html 文件等进行拦截,从而实现一些特殊的功能。
例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。
通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:二、Filter是如何实现拦截的?Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter 方法,因此,在该方法内编写代码可达到如下目的:调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
调用目标资源之后,让一段代码执行。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web 资源就会被访问,否则web资源不会被访问。
三、Filter开发入门3.1、Filter开发步骤Filter开发分为二个步骤:编写java类实现Filter接口,并实现其doFilter方法。
在web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
JAVA过滤器的使⽤(Filter)request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");这是在Servlet⾥⾯设置字符编码的代码,但是通常情况下Servlet不⽌⼀个,所以我们需要在每⼀个Servlet中都写上上⾯的代码,这样的话,不仅⿇烦,⽽且容易搞混淆。
所以我们对于这类多个Servlet中会执⾏相同的代码的时候,我们通常可以使⽤过滤器来帮我们完成操作:过滤器:如果想要使⽤过滤器,⾸先需要实现Filter类,并重写三个需要的⽅法:import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(filterName = "TestFilter2",urlPatterns = "/*")public class TestFilter2 implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}}init⽅法: 容器在创建当前过滤器的时候⾃动调⽤;destroy⽅法: 容器在销毁当前过滤器的时候⾃动调⽤doFilter⽅法: 过滤器的主要代码写在这个地⽅1 @WebFilter(filterName = "TestFilter2",urlPatterns = "/*")这⼀⾏代码的意思是添加⼀个注解,通过这⾏代码就不需要再去web.xml中注册了其中 filterName 代表的是这个过滤器的名字,后⾯那个urlPatterns 代表的是过滤的路径 /* 代表所有路径,意味着访问所有的路径的时候都会先访问这个过滤器chain.doFilter(req, resp);这⼀⾏代码代表的是如果还有其他的过滤器就调⽤其它的过滤器,但是需要注意,这⼀⾏代码必须写在doFilter⽅法的最后⾯1public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {2//这样在每个Servlet执⾏的时候都会先进⾏这个3 HttpServletRequest request = (HttpServletRequest) req;4 HttpServletResponse response = (HttpServletResponse) resp;56 request.setCharacterEncoding("utf-8");7 response.setContentType("text/html;charset=utf-8");89//因为有可能不⽌这⼀个过滤器,所以需要将所有的过滤器执⾏10//注意这⼀⾏代码⼀定要写到最后11 chain.doFilter(req, resp);12 }其中3-7⾏代码就是设置编码由于doFilter传递进来的默认是ServletRequest对象⽽设置字符集的是在HttpServetRequest 所以我们需要强制转换⼀下转换过后我们就可以进⾏设置了。
过滤器创建一个Filter 只需两个步骤:(1)创建Filter 处理类:(2)在web.xml 文件中配置Filter 。
创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。
• void init(FilterConfig config): 用于完成Filter 的初始化。
• void destroy(): 用于Filter 销毁前,完成某些资源的回收。
• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。
在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>该元素位于filter-mapping中。
一、理解Struts2拦截器1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.解析:--------------------------------------------------------------------------------------------拦截器和AOP的关系拦截器与AOP (Aspect Orient Program ,面向切面编程)是密切相关的,AOP 从程序运行角度来考虑程序的流程,取得业务处理过程的切面,在特定切面通过系统自动插入特定方法。
filter过滤器原理Filter过滤器是Java Servlet规范中的一个重要组成部分,它主要用于Web应用程序中对请求或响应进行一些处理或修改。
Filter过滤器能够拦截客户端请求和响应,并对其进行一些预处理或后处理,同时不对底层资源进行任何的改变。
在Web应用程序中,客户端的请求会按照一定的顺序被多个过滤器拦截,最后才会到达目标Servlet或JSP页面。
过滤器的拦截顺序是由web.xml文件中的顺序决定的,顺序越靠前的过滤器越先拦截请求。
Filter过滤器的工作过程可以用下面的流程来描述:1、当客户端发起请求时,服务器会根据客户端请求的URL找到相应的Servlet或JSP 页面。
2、在Servlet或JSP页面被执行之前,在过滤器链中的第一个过滤器会被调用。
这个过滤器可以实现一些真正的过滤操作,比如验证用户身份等。
3、当第一个过滤器完成处理后,请求会按照web.xml文件中定义的顺序,依次经过它后面的过滤器。
4、如果过滤器链中有多个过滤器,请求将根据它们的顺序进行处理。
当请求到达最后一个过滤器时,如果没有被任何一个过滤器拦截,则将请求传递给目标Servlet或JSP 页面。
5、在Servlet或JSP页面处理请求并生成响应后,响应会按照相反的顺序经过过滤器链中的过滤器进行处理或修改,最终响应到达客户端。
通过使用Filter过滤器,可以有效的将Web应用程序的功能模块拆分成多个独立的模块,这些模块可以按照一定的顺序调用,扩展或修改Web应用程序的行为。
具体的优点包括:1、实现模块可复用性:在一个应用程序中,多个模块可能会需要进行相同或相似的过滤操作,而使用Filter可以将这些操作独立出来,易于重复使用。
2、抽象控制流:通过使用Filter可以抽象出整个请求和响应的控制流,实现更细粒度的控制。
3、有效的处理URL:通过Filter可以有效的处理URL,实现URL的解析和路由处理。
4、可扩展性:在Web应用程序中,Filter可以很方便的进行增加、删除或修改,从而实现Web应用程序的功能扩展。
Java Filter过滤机制详解以前以为Filter只是一个特殊点的Servlet,用进只需在web.xml中配置一下拦截路径就可以了,可经过这两天的深入学习,才知道以前对Filter类的了解和使用都太过浅薄了。
在网上看了很多篇相关的技术文章,现提取它们中的精髓(我认为能说明问题的东西)及我个人的一些学习经验作如下总结,希望能帮助大家更好地理解Filter 的过滤机制。
要学习Filter,就必须先理解和掌握servlet的调用机制和流程。
关于servlet,网上也有很多相关文章,大家若有不明白的可以到百度中搜一下,我这里为了突出重点就不多说了。
好,下面进入正题。
一、什么是FilterFilter技术是servlet2.3新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高.它新增加的功能包括:1.应用程序生命周期事件控制;2.新的国际化;3.澄清了类的装载规则;4.新的错误及安全属性;5.不赞成使用HttpUtils类;6.各种有用的方法;7.阐明并扩展了几个servlet DTD;8.filter功能.其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response.Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet链).一个filter包括:1.在servlet被调用之前截获;2.在servlet被调用之前检查servlet request;3.根据需要修改request头和request数据;4.根据需要修改response头和response数据;5.在servlet被调用之后截获.你能够配置一个filter到一个或多个servlet;单个servlet或servlet组能够被多个filter使用.几个实用的filter包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等.一个filter必须实现javax.servlet.Filter接口定义的三个方法:doFilter、init 和destroy。
一、引言在Java的Web开发中,过滤器(Filter)是一种十分重要的组件,它可以拦截用户请求并在请求到达Servlet之前或者Servlet响应返回给客户端之前进行一些处理。
而过滤器链(Filter chain)则是由多个过滤器按照一定的顺序组成,它们共同为请求和响应提供处理和转换。
本文将深入探讨Java Web过滤器链的工作原理,包括过滤器链的执行顺序、过滤器链中的过滤器如何协作以及一些常见的应用场景。
二、过滤器链的执行顺序1. 过滤器链中的过滤器是按照在web.xml文件中的配置顺序依次执行的。
在web.xml文件中,每个过滤器都有一个<filter>标签来定义,而<filter>标签的顺序就是过滤器执行的顺序。
2. 过滤器的执行顺序并不是固定的,可以通过修改web.xml文件中<filter-mapping>标签的顺序来改变过滤器的执行顺序。
一般情况下,过滤器链的执行顺序是按照web.xml文件中<filter-mapping>标签的顺序执行的。
3. 过滤器链的最后一个过滤器是请求的目标资源(Servlet或JSP),而请求的目标资源执行完毕后,过滤器链会按照相反的顺序执行,即按照web.xml文件中<filter-mapping>标签的相反顺序执行。
三、过滤器链中的过滤器如何协作1. 过滤器链中的过滤器通过FilterChain对象进行协作。
在过滤器的doFilter()方法中,可以调用FilterChain对象的doFilter()方法将请求传递给下一个过滤器或者目标资源,同时也可以在doFilter()方法中对请求和响应进行一些处理。
2. 过滤器链是一个有序的链表结构,每个过滤器都可以在处理完自己的逻辑之后选择将请求传递给下一个过滤器或者目标资源,也可以选择在自己的逻辑中结束请求的处理并将响应返回给客户端。
3. 过滤器链中的过滤器可以共享同一个HttpServletRequest和HttpServletResponse对象,因此可以进行一些共享数据和状态的操作。
在Java中,"filter" 一词通常与集合数据和Stream API相关联。
Java提供了一种称
为过滤器(Filter)的机制,它允许你通过指定条件来筛选集合中的元素。
在Java 中,过滤器通常与Lambda表达式和Stream API一起使用,以便更轻松地编写简洁、可读的代码。
以下是在Java中使用过滤器的一些常见场景和示例:
1. 使用 Stream 的filter方法:
假设有一个包含整数的列表,我们想要过滤出所有偶数:
2. 使用 Stream 的filter和map方法:
在这个例子中,我们筛选出长度大于3的字符串,并将它们转换为大写:
这里的filter方法用于筛选长度大于3的字符串,而map方法用于将它们转换为大写。
3. 使用Predicate自定义过滤条件:
有时候,我们可能想要定义一个自定义的过滤条件,这时可以使用Predicate接口:
这里的customFilter是一个自定义的Predicate,它筛选以字母 "a" 开头的字符串。
总体来说,Java中的过滤器主要使用Stream API中的filter方法,结合Lambda表达式来实现集合元素的条件筛选。
1、Filter是什么?Filter 技术是servlet 2.3 新增加的功能。
Filter翻译过来的意思就是过滤器,能对客户端的消息进行预处理,然后将请求转发给其它的web组件,可以对ServletHttpRequest和ServletHttpResponse进行修改和检查。
例如:在Filter 中可以检查用户是否登录,对未登录的用户跳转到登陆界面。
2、过滤器快速入门要定义一个过滤器,则需要实现javax.servlet.Filter接口,一个过滤器中包含了三个与生命周期相关的方法:▪void init(FilterConfig config) 过滤器初始化时执行,FilterConfig 可以用来获取过滤器的初始化参数。
▪void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)过滤器过滤请求时执行,包含了request和response,chain用来是否执行下一步请求。
▪destroy() web容器(tomcat)停止时执行第一步:创建DemoFilter.java第二步:在web.xml文件中添加如下配置:url-pattern配置为/*,表示过滤所有请求。
启动tomcat,可以看到如下输出:说明Filter的init方法在web容器启动的时候执行,读者可以自行验证destroy()方法会在web容器停止时执行,访问主页:在访问主页的时候浏览器是一片空白的,控制台输出上面的消息,Filter只会实例化一次,为什么我们访问不到我们要访问的内容呢?只需要在doFilter方法中加入如下的语句就可以了:FilterChain(过滤器链)是用来干什么的呢?这个对象只包含一个void doFilter(ServletRequest request, ServletResponse response)方法,Filter 调用此方法去调用下一个web组件(Filter,Servlet等),如果不调用此方法,那么下一个web组件不会被执行。
Java 过滤器(Filter)是Java Web 应用程序中的一种重要组件,用于拦截请求和响应,并在它们到达或离开应用程序之前进行处理。
过滤器可以在多个阶段对请求和响应进行拦截,例如在客户端发送请求到服务器处理请求、服务器处理请求到返回响应、响应返回客户端之前等。
Java 过滤器的实现原理如下:1. 实现Filter 接口要实现一个过滤器,需要创建一个类并实现Filter 接口。
Filter 接口包含三个方法:* init(FilterConfig):用于初始化过滤器,此方法在过滤器创建时被调用,只会被调用一次。
在此方法中可以读取FilterConfig 对象中的参数,获取配置信息等。
* doFilter(ServletRequest, ServletResponse, FilterChain):此方法是过滤器的主要方法,用于拦截请求和响应。
当请求到达应用程序时,会被传递给doFilter 方法。
在此方法中,可以对请求和响应进行任何必要的处理,例如修改请求或响应的内容、记录日志等。
在处理完请求和响应后,需要将其传递给FilterChain,以便继续处理请求或返回响应。
* destroy(void):用于销毁过滤器,当过滤器不再需要使用时,此方法被调用。
在此方法中可以执行任何必要的清理操作,例如释放资源等。
2. 配置过滤器在web.xml 文件中,可以通过<filter> 元素定义一个过滤器,并指定过滤器的名称、类名和初始化参数等信息。
同时还需要指定过滤器在哪些URL 路径上生效,例如可以使用<filter-mapping> 元素将过滤器映射到指定的URL 路径上。
3. 应用过滤器当一个请求到达应用程序时,它会被传递给所有已经配置好的过滤器,并按相反的顺序执行:即先执行doFilter 方法,然后执行FilterChain 中的下一个组件(例如Servlet 或JSP),再返回响应给客户端。
Java中使⽤Filter过滤器的⽅法Filter过滤器着重记录下 public void doFilter(){} ⽅法参数:(1) ServletRequest servletRequest请求reqeust;(2)ServletResponse servletResponse响应response;(3)FilterChain filterChain参数 filterChain,有⼀个doFilter() ⽅法,调⽤这个⽅法,可以使程序继续往下⾛,执⾏后续代码,如果有多个过滤器,它会继续执⾏下⼀个过滤器逻辑(开发中会出现多个过滤器情况)。
例⼦(下边例⼦是在springboot项⽬中的)使⽤过滤器,⽇志输出接⼝的响应时间filter -> FilterLog.javapackage com.lxc.springboot.filter;/*** 这个过滤器其实是给容器(tomcat)使⽤的* public void doFilter(){} ⽅法参数:** ServletRequest servletRequest :请求reqeust* ServletResponse servletResponse :响应response* FilterChain filterChain : filterChain.doFilter() 可以使⽤多个过滤器,继续调⽤下⼀个过滤器** IDEA: 格式化代码 -> ctrl + alt + l* 添加 @Component 注解, spring会扫描这个类*/import org.slf4j.Logger;import org.slf4j.LoggerFactory;import ponent;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;@Componentpublic class FilterLog implements Filter {// 使⽤指定类 - 初始化⽇志对象private static final Logger LOG = LoggerFactory.getLogger(FilterLog.class);// 初始化⽅法@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}/*** 下边就是⼀个servlet,servlet - 就是我们的请求、响应,所以我们会拿到 request 和 response** @param servletRequest* @param servletResponse* @param filterChain*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {/*** request 可以拿到所有的请求信息*/HttpServletRequest request = (HttpServletRequest) servletRequest;("【全局过滤器】");("--------- FilterLog⽇志开始 --------- ");("- 请求地址: {}, ⽅法: {}", request.getRequestURL().toString(), request.getMethod());("- 远程地址: {}, 域名: {}, 端⼝: {}", request.getRemoteAddr(), request.getRemoteHost(), request.getRemotePort());long startTime = System.currentTimeMillis(); // 13位时间戳(毫秒)// 继续往后执⾏,是否有别的过滤器,没有 -> 进⼊应⽤,执⾏逻辑filterChain.doFilter(servletRequest, servletResponse);(" --------- FilterLog 结束,耗时: {} ms --------- ", System.currentTimeMillis() - startTime);}// web服务器关闭时,Filter会销毁@Overridepublic void destroy() {Filter.super.destroy();}}输出如下:到此这篇关于Java中使⽤Filter过滤器的⽅法的⽂章就介绍到这了,更多相关Filter过滤器内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Java8过滤器(Filter)1、在Java之前对List进⾏过滤的⽅式public class BeforeJava8 {public static void main(String[] args) {List<Person> peoples = Arrays.asList(new Person("java", 22),new Person("js", 35),new Person("css", 31));Person result = getStudentByName(peoples, "java");System.out.println(result);}private static Person getStudentByName(List<Person> peoples, String name) {Person result = null;for (Person person : peoples) {if (name.equals(person.getName())) {result = person;}}return result;}}2、在Java8使⽤Filter过滤Listpublic class FilterJava8 {public static void main(String[] args) {List<Person> peoples = Arrays.asList(new Person("java", 22),new Person("js", 35),new Person("css", 31));Person result1 = peoples.stream().filter(p -> "java".equals(p.getName())).findAny().orElse(null);System.out.println(result1);Person result2 = peoples.stream().filter(p -> "spring".equals(p.getName())).findAny().orElse(null);System.out.println(result2);Person result3 = peoples.stream().filter((p) -> "java".equals(p.getName()) && 22 == p.getAge()).findAny().orElse(null);System.out.println(result3);// 使⽤map收集String name = peoples.stream().filter(p -> "js".equals(p.getName())).map(Person::getName).findAny().orElse("");System.out.println(name);System.out.println("---------");List<String> names = peoples.stream().map(Person::getName).collect(Collectors.toList());names.forEach(System.out::println);}}。
Java中过滤器(Filter)和拦截器(Interceptor)的使⽤⽬录1.过滤器 (Filter)2.拦截器 (Interceptor)3.区别3.11、实现原理不同3.2 使⽤范围不同3.3 触发时机不同3.4 拦截的请求范围不同3.5 注⼊Bean情况不同3.6 控制执⾏顺序不同1.过滤器 (Filter)过滤器的配置⽐较简单,直接实现Filter 接⼝即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接⼝中定义了三个⽅法。
init() :该⽅法在容器启动初始化过滤器时被调⽤,它在 Filter 的整个⽣命周期只会被调⽤⼀次。
注意:这个⽅法必须执⾏成功,否则过滤器会不起作⽤。
doFilter() :容器中的每⼀次请求都会调⽤该⽅法, FilterChain ⽤来调⽤下⼀个过滤器 Filter。
destroy():当容器销毁过滤器实例时调⽤该⽅法,⼀般在⽅法中销毁或关闭资源,在过滤器 Filter 的整个⽣命周期也只会被调⽤⼀次@Componentpublic class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter 前置");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter 处理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("Filter 后置");}}2.拦截器 (Interceptor)拦截器它是链式调⽤,⼀个应⽤中可以同时存在多个拦截器Interceptor,⼀个请求也可以触发多个拦截器,⽽每个拦截器的调⽤会依据它的声明顺序依次执⾏。
详解JavaWeb中的过滤器Filter ⽬录⼀、什么是过滤器1.1使⽤步骤⼆、初体验2.1mynav.html2.2FilterServlet程序2.3HelloServlet程序2.4web.xml2.5index.jsp三、测试四、Filter的⽣命周期五、FilterConfig类六、FilterChain过滤器链七、Filter的拦截路径⼋、精确匹配8.1⽬录匹配8.2后缀名匹配⼀、什么是过滤器1.Filter过滤器的作⽤:拦截请求2.拦截请求常见场景:(1)权限检查(2)⽇记操作(3)事务管理1.1 使⽤步骤Filter 过滤器的使⽤步骤:1、编写⼀个类去实现Filter 接⼝2、实现过滤⽅法doFilter()3、到web.xml 中去配置Filter 的拦截路径⼆、初体验web⼯程下新建⼀个admin⽬录,作为需要权限才能访问的⽬录,其中有两个⽂件2.1 mynav.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>导航</title></head><body><table><tr><td>百度<input type="text"></td></tr><tr><td>Google<input type="text"></td></tr><tr><td>必应<input type="text"></td></tr></table></body></html>2.2 FilterServlet程序package com.filter.filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.io.IOException;/*** @author ningqian* @create -05-16 20:17*///注意导包是javaxpublic class FilterServlet implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("来到Filter过滤器");HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;HttpSession session = httpServletRequest.getSession();//如果session的属性user为空,转发到⾸页if(session.getAttribute("user")==null){servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);}else{//如果session的属性user不为空,则放⾏filterChain.doFilter(servletRequest,servletResponse);}}@Overridepublic void destroy() {}}2.3 HelloServlet程序package com.filter.filter;import java.io.*;import javax.servlet.http.*;import javax.servlet.annotation.*;@WebServlet(name = "helloServlet", value = "/hello-servlet")public class HelloServlet extends HttpServlet {private String message;public void init() {message = "Hello World!";}public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");// HelloPrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>" + message + "</h1>");out.println("</body></html>");HttpSession session = request.getSession();session.setAttribute("user","ningqian");}public void destroy() {}}2.4 web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>FilterServlet</filter-name><filter-class>com.filter.filter.FilterServlet</filter-class></filter><filter-mapping><filter-name>FilterServlet</filter-name><!--表⽰受限的⽂件--><url-pattern>/admin/*</url-pattern></filter-mapping><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.filter.filter.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>2.5 index.jsp<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>FilterServlet</filter-name><filter-class>com.filter.filter.FilterServlet</filter-class></filter><filter-mapping><filter-name>FilterServlet</filter-name><!--表⽰受限的⽂件--><url-pattern>/admin/*</url-pattern></filter-mapping><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.filter.filter.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>三、测试1.启动服务器2.在浏览器地址栏输⼊:http:localhost:8080/filter/admin/1.jpg表⽰直接访问admin⽬录下的图⽚由于此⽬录下的⽂件在web.xml中配置为受限,所以此时请求被FilterServlet收到,使⽤doFilter⽅法进⾏请求过滤检查,发现会话session中没有user属性,所以将该请求转发到index.jsp3.在浏览器地址栏输⼊:http:localhost:8080/filter/⾸页不在受限的⽬录下,所以可以直接访问,点击页⾯上的链接Hello Servlet,此时,将请求发到服务器,HelloServlet程序接收,通过doGet()⽅法,给会话session的user赋值4.再次在浏览器输⼊:http:localhost:8080/filter/admin/1.jpg,此时就可以正常访问。
Java Filter用法1. 概述Java中的Filter是一种被用于过滤请求和响应的组件。
它可以在请求到达目标资源之前对请求进行预处理,也可以在响应返回给客户端之前对响应进行后处理。
Filter通常被用于实现一些通用的、与业务逻辑无关的功能,如日志记录、权限控制、字符编码转换等。
2. Filter接口在Java中,Filter是一个接口,定义了三个方法:public interface Filter {void init(FilterConfig filterConfig) throws ServletException;void doFilter(ServletRequest request, ServletResponse response, FilterChai n chain) throws IOException, ServletException;void destroy();}•init(FilterConfig filterConfig):在Filter被初始化时调用,可以读取配置信息或者做一些初始化工作。
•doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实际的过滤逻辑需要在这个方法中实现。
在该方法中,可以对请求和响应进行处理,并将处理后的请求和响应传递给下一个Filter或Servlet。
•destroy():在Filter被销毁时调用,可以释放资源或清理工作。
3. 使用Filter要使用Filter,需要按照以下步骤进行配置和编写代码:3.1 配置web.xml首先,在web.xml文件中配置Filter的映射关系。
例如:<filter><filter-name>myFilter</filter-name><filter-class>com.example.MyFilter</filter-class><init-param><param-name>param1</param-name><param-value>value1</param-value></init-param></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/path/*</url-pattern></filter-mapping>上述配置中,我们定义了一个名为myFilter的Filter,并将其映射到了以/path/开头的URL路径上。
Java Filter过滤机制详解以前以为Filter只是一个特殊点的Servlet,用进只需在web.xml中配置一下拦截路径就可以了,可经过这两天的深入学习,才知道以前对Filter类的了解和使用都太过浅薄了。
在网上看了很多篇相关的技术文章,现提取它们中的精髓(我认为能说明问题的东西)及我个人的一些学习经验作如下总结,希望能帮助大家更好地理解Filter 的过滤机制。
要学习Filter,就必须先理解和掌握servlet的调用机制和流程。
关于servlet,网上也有很多相关文章,大家若有不明白的可以到百度中搜一下,我这里为了突出重点就不多说了。
好,下面进入正题。
一、什么是FilterFilter 技术是servlet 2.3 新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高.它新增加的功能包括:1. 应用程序生命周期事件控制;2. 新的国际化;3. 澄清了类的装载规则;4. 新的错误及安全属性;5. 不赞成使用HttpUtils 类;6. 各种有用的方法;7. 阐明并扩展了几个servlet DTD;8. filter功能.其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).一个filter 包括:1. 在servlet被调用之前截获;2. 在servlet被调用之前检查servlet request;3. 根据需要修改request头和request数据;4. 根据需要修改response头和response数据;5. 在servlet被调用之后截获.你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等.一个filter必须实现javax.servlet.Filter接口定义的三个方法: doFilter、init 和destroy。
(在三个方法在后面后有详细的介绍).二、Filter体系结构2.1、Filter工作原理(执行流程)当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。
请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。
当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。
同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。
**************************************************************************************** ********************************在这里,我要插几句——关于过滤链的问题:上面说了,当一个请求符合某个过滤器的过滤条件时该请求就会交给这个过滤器去处理。
那么当两个过滤器同时过滤一个请求时谁先谁后呢?这就涉及到了过滤链FilterChain。
所有的奥秘都在Filter的FilterChain中。
服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。
(注:这一点Filter和Servlet是不一样的,具体请参看我的另一篇文章:Servlet和Filter 映射匹配原则之异同)执行的顺序就如下图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。
这里还有一点想补充:大家有没有想过,上面说的“执行请求的资源”究竟是怎么执行的?对于“执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码”这些我可以理解,无非就是按顺序执行一句句的代码,但对于这个“执行请求的资源”我刚开始却是怎么也想不明白。
直到我见到上面这张图片才恍然大悟(我说过了,这篇文章中的资料都是我从网上收集来的,当我看到上面的文字时是没有图片看的)。
其实是这样的:通常我们所访问的资源是一个servlet或jsp页面,而jsp其实是一个被封装了的servlet(每个jsp执行前都会被转化为一个标准的servlet,这点若还有不明白的请自己到网上查一下吧),于是我们就可以统一地认为我们每次访问的都是一个Servlet,而每当我们访问一个servlet时,web容器都会调用该Servlet 的service方法去处理请求。
而在service方法又会根据请求方式的不同(Get/Post)去调用相应的doGet()或doPost()方法,实际处理请求的就是这个doGet或doPost方法。
写过servlet的朋友都应该知道,我们在doGet(或doPost)方法中是通过response.getWriter()得到客户端的输出流对象,然后用此对象对客户进行响应。
到这里我们就应该理解了过滤器的执行流程了:执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>第n个过滤器的chain.doFilter()之前的代码——>所请求servlet 的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。
以上是我的理解,若有不对之处,还有大家不吝指教啊,大家一起学习!!************************************************************************************************************************2.2、Servlet过滤器APIServlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。
2.2.1 public Interface Filter所有的过滤器都必须实现Filter接口。
该接口定义了init,doFilter0,destory()三个方法:(1) public void init (FilterConfig filterConfig) throws ServletException.当开始使用servlet过滤器服务时,Web容器调用此方法一次,为服务准备过滤器;然后在需要使用过滤器的时候调用doFilter(),传送给此方法的FilterConfig对象,包含servlet过滤器的初始化参数。
(2)public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws java.io.IOException,ServletException.每个过滤器都接受当前的请求和响应,且FilterChain过滤器链中的过滤器(应该都是符合条件的)都会被执行。
doFilter方法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。
过滤器通过传送至此方法的FilterChain参数,调用chain.doFilterO将控制权传送给下一个过滤器。
当这个调用返回后,过滤器可以在它的Filter方法的最后对响应做些其他的工作。
如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。
当链中的最后一个过滤器调用chain.doFilterO方法时,将运行最初请求的Servlet。
(3)public void destroy()一旦doFilterO方法里的所有线程退出或已超时,容器调用此方法。
服务器调用destoryO以指出过滤器已结束服务,用于释放过滤器占用的资源。
2.2.2 public interface FilterChainpublic void doFilter(ServletRequest request,ServletResponse response) thlows java.io.IOException,ServletException此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤器,如果是最后一个过滤器,则下一个就调用目标资源。
2.2.3 public interface FilterConfigFilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。
该接口提供了以下4个方法:(1)public java.1ang.String getFilterName0返回web.xml部署文件中定义的该过滤器的名称。
(2)public ServletContext getServletContextO返回调用者所处的servlet上下文。
(3)public java.1ang.String getlnitParameter(java.1ang.String name)返回过滤器初始化参数值的字符串形式,当参数不存在时,返回nul1.name是初始化参数名。
(4)public java.util.Enumeration getlnitParameterNames()以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空。