1.管理所有WEB资源:(Jsp, Servlet, 静态图片文件或静态 html 文件等)文件等进行拦截,从而实现一些特殊的功能

2.Filter接口中有一个doFilter方法,当我们编写好Filter,并配置(WEB.XML)对哪个web资源进行拦截后,

WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。(如对request和response进行预处理 解决编码问题)

是否调用目标资源(即是否让用户访问web资源)。

调用目标资源之后,让一段代码执行。(如事务的提交 压缩发送到服务器的数据等)

3.Filter开发步骤:

Filter开发分为二个步骤:

  1.编写java类实现Filter接口,并实现其doFilter方法。

  2.在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

4.Filter执行顺序 (Filter执行链)

Filter在web.xml文件中注册的顺序,决定了其在Filter执行链中的位置,首先执行注册在最前面的Filter

 System.out.println("filterdemo1执行前!!!");

 //在执行到chain.doFilter方法,会去看,后面是否还有过滤器,如果有,先执行下一个Filter的 doFilter,后面回过头来再执行chain.doFilter
chain.doFilter(request, response); //让目标资源执行,放行 System.out.println("filterdemo1执行后!!!");

  1.filter1执行前

  2.filter2执行前

  3.servlet执行

  4.filter2执行后

  5.filter1执行后

调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,

如果有,则立即调用第2个filter,如果没有,则立即调用目标资源。 /*注:chain.doFilter(request,response) 执行后,立即放行,这行代码后面的语句,会等目标执行完后,再执行*/

5.Filter生命周期(类似于servlet)由WEB服务器负责 /*创建和销毁都只执行一次*/

  1.Filter的创建(WEB服务器启动)web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能

  2.Filter的销毁(WEB服务器关闭) Web容器调用destroy方法销毁Filter

  3.通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

6.映射Filter

  <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 对资源的多种调用方式进行拦截。

/*Filter高级*/

7.包装设计模式 (当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强)

  1.编写子类 覆盖需增强的方法
  2.使用包装设计模式对方法进行增强(优先考虑)

 /*
1.实现与被增强对象相同的接口
2、定义一个变量记住被增强对象
3、定义一个构造器,接收被增强对象
4、覆盖需要增强的方法
5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
*/ class MyCharacterEncodingRequest extends HttpServletRequestWrapper{ private HttpServletRequest request;
public MyCharacterEncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) { try{
String value= this.request.getParameter(name);
if(value==null){
return null;
} if(!this.request.getMethod().equalsIgnoreCase("get")) {
return value;
} value = new String(value.getBytes("ISO8859-1"),this.request.getCharacterEncoding());
return value; }catch (Exception e) {
throw new RuntimeException(e);
}
}
}

    1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。
    2.在类中定义一个变量,变量类型即需增强对象的类型。
    3.在类中定义一个构造函数,接收需增强的对象。
    4.覆盖需增强的方法,编写增强的代码。
    5.不想增强的方法,直接调用被增强对象(目标对象)的方法

8.使用Decorator设计模式增强request对象(默认有这样一个实现类HttpServletRequestWrapper,让你自由发挥)

(new一个自己的Request类,继承HttpServletRequestWrapper,然后在放行时使用(chain.doFilter(自己的request,response)))

  1.使用Decorator模式包装request对象解决get和post请求方式下的中文乱码问题

  1.使用Decorator模式包装request对象实现html标签转义功能

  3.使用Decorator模式包装request对象实现敏感字符过滤功能

如果将这三个过滤器联合起来使用(都用于增强getParameter方法),那么就相当于是把request对象包装了3次,request对象的getParameter方法经过3次重写,

使得getParameter方法的功能大大增强,可以同时解决中文乱码,html标签转义,敏感字符过滤这些需求。

9.使用Decorator设计模式增强response对象(HttpServletResponseWrapper)

  1.response增强案例——压缩响应正文内容

  2.response增强案例——缓存数据到内存

15.Filter(过滤器)的更多相关文章

  1. 15 Filter过滤器和Listener监听器

    1.Filter:过滤器 (1) 概念:生活中的过滤器:净水器,空气净化器,土匪.web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.过滤器的作用:一般用于完成通用的 ...

  2. Filter(过滤器)常见应用

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...

  3. java使用Filter过滤器对Response返回值进行修改

    转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...

  4. Filter过滤器笔记1

    Filter:过滤器 Filter主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.使用Filter的完整流程是:Filter对用户请求进行预处 ...

  5. SpringBoot+Shiro学习(七):Filter过滤器管理

    SpringBoot+Shiro学习(七):Filter过滤器管理 Hiwayz 关注  0.5 2018.09.06 19:09* 字数 1070 阅读 5922评论 1喜欢 20 先从我们写的一个 ...

  6. python的map、reduce和filter(过滤器)函数(廖雪峰老师python基础)

    1.map 语法: map(func,Iterable) map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返 ...

  7. 详解 Filter 过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  8. filter 过滤器(监听)

    Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...

  9. Java防止SQL注入2(通过filter过滤器功能进行拦截)

    首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...

  10. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

随机推荐

  1. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_17-异常处理-可预知异常处理-异常处理测试

    ResultCode有很多的实现类 cmsCode有很多类型的错误异常 pgeService内当CmsPage这个对象为空的时候,异常类型就可以抛出CmsCode里面的错误代码 if(cmsPage1 ...

  2. 下了个pkg包的jenkins,的使用方法

    三.如何启动Jenkins1.最简单的方法是双击Jenkins的pkg包,一步一步点同意,默认8080端口2.使用命令行启动打开terminal,进入到war包所在目录,执行命令: java -jar ...

  3. 容器版Jenkins连接Kubernetes---------非容器版jenkins是无法安装kubenetes插件的,所以无法连接k8s

    容器版Jenkins连接Kubernetes 特别注意:必须用谷歌浏览器,而且非容器版jenkins是无法安装kubernetes插件的,所以无法连接k8s 一.环境说明 OS系统版本:Ubuntu ...

  4. 实现两个DataTable的联合查询

    如方法一描述:将子表的数组追加到主表数组的下面.从而实现类似于视图(单表)的效果. 那么Left Join(Inner Join)和Right Join(Outer Join) 将如何实现呢? 明天仔 ...

  5. No manual entry for printf in section 3

    在引入标准库头文件的时候,很多时候要先查询一下该函数所属的库,以及基本用法,在linux系统下,可以使用 man 1-9 函数名称 但是 问题来了,No manual entry for printf ...

  6. leetcode907 Sum of Subarray Minimums

    思路: 对于每个数字A[i],使用单调栈找到A[i]作为最小值的所有区间数量,相乘并累加结果.时间复杂度O(n). 实现: class Solution { public: int sumSubarr ...

  7. Qt中QGraphics类坐标映射关系详解

    1.Item(图元)坐标:属于局部坐标,通常以图元中心为原点(中心对称),非中心对称类,比如dialog类,一般以左上角为原点,正方向x朝右,y朝下. 2.setPos的坐标是父类坐标系的坐标,一般对 ...

  8. mui ajax传参示例

    //加入购物车var data=[];var row1 = {good_id:'1',number:'2',goods_spec_ids:[1,2]};data.push(row1);console. ...

  9. PTA(Advanced Level)1033.To Fill or Not to Fill

    With highways available, driving a car from Hangzhou to any other city is easy. But since the tank c ...

  10. LeetCode 第 167 场周赛

    1290.二进制链表转整数 1291.顺次数 1292.元素和小于等于阈值的正方形的最大边长 1293.网格中的最短路径 1290.二进制链表转整数 1290.二进制链表转整数 给你一个单链表的引用结 ...