过滤器(Filter)&装饰模式

Day18 过滤器(Filter)&装饰模式

过滤器概述

什么是过滤器

Filter:过滤器:用于过滤的工具,用于过滤掉一些不需要的东西(拦截).
WEB中的过滤器:Web组件,在Java中最小的组件,就是一个类(双向)(注:Servlet也是一个Web组件)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMDENDGL-1577336237033)(C:\Users\lsdn\Desktop\mdjs\img\过滤器原理.png)]

过滤器详细解释

Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。

  1. 在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig
  2. Filter 程序是一个实现了 Filter 接口的 Java 类,与 Servlet 程序相似,它由 Servlet 容器进行调用和执行
  3. Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件

过滤器的特点

这个过程,我们进行以下操作:(过滤器中到底可以做些什么事情?)

  1. 以常规方式调用资源(即,调用servlet或JSP页面)
  2. 利用修改过的请求信息调用资源
  3. 调用资源,但在发送响应到客户机前对其进行修改,修改响应
  4. 阻止该资源调用,代之以转到其他的资源,返回一个特定状态代码或生成替换输出
  5. 阻止资源调用,不转到其它资源(错误的情况)
    请记住:一般处理方式是放行,转发

应用场景

过滤器可以做什么?

  • 可以对客户提交的数据进行重新编码
  • 使浏览器不缓存页面的过滤器
  • 可以过滤掉客户的屏蔽非法文字
  • 可以验证客户是否已经登录
  • 请求分发器(Struts2就是用这个做的请求分发)
  • 页面伪静态化处理(静态化)

过滤器(Filter)的生命周期(考点)

Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
Web容器调用destroy方法销毁Filter。destroy方 法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

在启动tomcat的时候就行创建过滤器,并且执行init方法
每次拦截到都会去执行doFilter方法
正常关闭会执行destory方法

面试题:>>>>>>>>

请简述一下什么是过滤器?并说出过滤器实现方式与生命周期
过滤器是一个web组件(我们之前学的servlet也是一个web组件),然后直接简述它的特点与配置方式(即需要实现哪个接口,里面有提供了哪些方法),而这些方法想好就是过滤器的生命周期方法。 再直接说出它的生命周期即可!

过滤器链(FilterChain)

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
FilterChain接口:代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。

过滤器链调用原理与顺序

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法(放行)中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

根据在web.xml文件中的顺序还决定调用的顺序
和的配置先后顺序有关系.

配置的路径

a.精确拦截指定资源
/hello:当前Filter只对/hello这个资源做过滤.
b.拦截所有资源
/:当前Filter对所有的请求做过滤.如字符编码
c.对部分资源进行拦截(以什么开头)
/system/:当前Filter 对/system/之后的请求做过滤.
比如:/system/list,/system/edit,/system/delete 如权限判断
d.对部分资源进行拦截(以什么结束)
*.html:当前Filter 对后缀是html的进行过滤
如伪(假)静态化
路径的配置提供了三种方式,方便大家以后根据不同的情况对不同的资源进行拦截

映射 Filter 子元素

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。默认值
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

从这里看是看 看示例:

一个过滤器 HelloFilter
两个Hello1Servlet Hello2Servlet
Hello1Servlet —跳转到-> Hello2Servlet
跳转方式:
① req.getRequestDispatcher("/hello2").forward(req, resp);
只过滤了一次

② resp.sendRedirect("/hello2");
过滤了两次
理解: 使用URL重定向(redirect)请求了两次,所以过滤两次()

如果 : 使用第一种方式也想过滤两次怎么办? 使用上面的配置

配置 filter-mapping 中的 dispatcher 注意:
① 如果 单独配置 REQUEST 相当于没写,默认就是这样的
② 如果 单独设置 FORWARD 只有使用forward跳转的才会被过滤,并且通过浏览器地址栏访问的都不会被过滤
③ 满足上面的如果(不管是forward 还是 redirect)都过滤两次,配置两个REQUEST FORWARD

分析:
Filter默认情况下,就只能对一次请求做过滤.
REQUEST
若需要对请求转发做过滤:
REQUEST
FORWARD

装饰者模式

核心思想就是对功能(方法)进行加强

  1. 继承,可以进行方法覆写—弊端,如果要进行多次加强每加强一 次,都要写一 个类继承原来已经有的类继承体系太多没会造成继承爆炸
  2. 装饰者模式,在原来已有的基础上进行加强,不去改变原来的代码,相比继承来说就更加的灵活

装饰者模式的体现
new InputStreamReader(new FileInputStream(new File("D:/1.p9));

发布了54 篇原创文章 · 获赞 9 · 访问量 956

猜你喜欢

转载自blog.csdn.net/qq_40629521/article/details/103713565
今日推荐