---Filter(一)简介
来源:互联网 发布:数据库中级工程师证书 编辑:程序博客网 时间:2024/05/16 12:13
Filter简介
OneFilter.java
package com.tuxianchao.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;/** * Filter * * 1.Filter是java web中一个重要的组件,Filter能够对servlet容器的请求和响应进行拦截和修改 * * 2.Filter本身不产生任何请求相应的对象,他只能对servlet容器的请求响应提供过滤功能,在请求到达目标(servlet,jsp) * 前拦截检查request,修改request;在目标资源返回客户端浏览器的时候进行拦截检查response对象,修改response对象。 * * 3.servlet可以过滤的可以是servlet,jsp,html。 * * * Filter接口 * * Filter和Servlet接口类似, 提供了destroy(),doFilter(ServletRequest request, * ServletResponse response, FilterChain chain),init(FilterConfig * filterConfig)方法 * >init(FilterConfig filterConfig) * Filter和servlet的生命周期类似,当servlet启动的时候,创建加载Filter实例,由servlet容器调用filter * 的init方法。并且传入一个FilterConfig filterConfig参数,该对象包含filter的配置信息(在web.xml配置的初始化参数,filter-name,getServletContext等) * * >destory() * 当servlet容器卸载当前web应用的时候由servlet来调用这个方法,调用这个方法 * >doFilter(ServletRequest request, ServletResponse response, FilterChain * chain) * doFilter才是真正过滤的逻辑代码部分,这个方法中request,response参数就是封装了请求响应信息的参数 * 可以在过滤器中检查,修改请求响应的信息;filterchain参数用于访问后续的过滤器,chain.doFilter(request, response); * 将请求传给下一级过滤器,(FilterChain是一个过滤器的链,其链的顺序和在web.xml中映射filter-mapping的顺序有关)。 * 编写一个Filter步骤: * 1.只需要实现java.servlet.filter接口中对应的方法即可。 * 2.在web.xml文件中配置filter: * <filter>标签用来定义一个过滤器 * <filter-name> filter的名字 * <filter-class> filter全类名 * <init-param> 为过滤器提供初始化参数。可有多个 * <filter-mapping>标签用来定义一个过滤器 * <filter-name> filter的名字 * <url-pattern> 指定和filter关联的URL,为”/*”表示所有URL(这里有两层含义,我的可以理解是 * 一方面对客户浏览器来说,是访问filter的地址,从servlet容器或者web应用来说,它制指定了该过滤器过滤的资源) * * */public class OneFilter implements Filter { public void destroy() { System.out.println("destory......"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response); System.out.println("dofilter..."); } public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init..."); }}
Filter和Filter链
可以是一个Filter过滤一个目标和多个Filter过滤一个目标
下列是多个Filter时候filter中都filter在请求响应的时候执行的顺序:
OneFilter.java
package com.tuxianchao.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 OneFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("1.Before OneFilter's dofilter"); chain.doFilter(request, response); System.out.println("2.After OneFilter's dofilter"); } public void init(FilterConfig filterConfig) throws ServletException { }}
SecondFilter.java
package com.tuxianchao.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 SecondFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("3.Before SecondFilter's dofilter"); chain.doFilter(request, response); System.out.println("4.After SecondFilter's dofilter"); } public void init(FilterConfig filterConfig) throws ServletException { }}
web.xml中配置的顺序:
<!--配置Filter --> <filter> <filter-name>OneFilter</filter-name> <filter-class>com.tuxianchao.filter.OneFilter</filter-class> </filter> <filter> <filter-name>SecondFilter</filter-name> <filter-class>com.tuxianchao.filter.SecondFilter</filter-class> </filter> <!-- Filterchain的顺序和filter-mapping的顺序一致 --> <filter-mapping> <filter-name>OneFilter</filter-name> <url-pattern>/a.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SecondFilter</filter-name> <url-pattern>/a.jsp</url-pattern> </filter-mapping>
执行结果:
Console输出:
1.Before OneFilter's dofilter3.Before SecondFilter's dofilter5.jsp page4.After SecondFilter's dofilter2.After OneFilter's dofilter
在本例子中,在index.jap由一个超链接跳转到a.jsp中,对目标资源a.jsp创建了两个filter (OneFilter和SecondFilter),在执行的时候,进入第一个过滤器(OneFilter)后执行相应的代码,当执行到chain.doFilter(reqquest,response)的时候,过滤器放行转而进入下一个过滤器,以此类推,在执行完最后一个过滤器成功请求到目标页面的时候,会执行最后一个Filter的doFilter方法后的代码,然后返回到上一个filter的doFilter后的代码,最后一直到第一个Filter。
由上图可以看出,在请求和响应的时候,在filter中的doFilter方法的前后分别是请求和相应的执行顺序,也就是说,在doFilter方法前可以对请求信息拦截检查修改再确定时候放行,在doFilter方法后可以对响应信息进行修改。
0 0
- ---Filter(一)简介
- Filter(过滤器)简介
- Filter (一)
- Filter简介
- Filter简介
- Filter简介
- Filter简介
- Filter简介
- filter简介
- Filter简介
- Filter简介
- 深入浅出DirectShow Filter(一)
- 深入浅出DirectShow Filter(一)
- Filter的使用(一)
- 深入浅出DirectShow Filter(一)
- java过滤器(filter)一
- Filter的使用方法(一)
- 过滤器基础知识--Filter(一)
- 随机流
- 【链表3】反转链表
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- EI(SCI) 收录国外英文期刊(计算机类),A类期刊会议
- 过滤流:buffer流和data流
- ---Filter(一)简介
- 【CSS】CSS入门——标准流
- 掰玉米歌词《粉红色的回忆》
- 数组指针和指针数组的区别
- 杭电 人见人爱A^B【和数据大小的考虑有关】
- B1013-素数筛选法
- python web 学习总结
- [FreeCodeCamp-JavaScript]Intermediate Algorithm
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分