7.过滤器

五更疏欲断,一树碧无情。

李商隐·《蝉》

一、过滤器

类似Servlet,过滤器也是一个Java组件。请求发送至Servlet之前,可以用过滤器截获和处理请求;Servlet结束工作之后,在响应发回给客户之前,也可以用过滤器处理响应。
过滤器主要的任务:

  1. 请求过滤器:
  • 完成安全检查
  • 重新格式化请求首部或体
  • 建立请求审计或日志
  1. 响应过滤器:
  • 压缩响应流
  • 追加或修改响应流
  • 创建一个完全不同的响应

二、建立过滤器

2.1 代码

public class MyFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws ServletException,IOException {//取常规的ServletRequest和ServletResponse做参数
        HttpServletRequest httpReq = (HttpServletRequest) req;//强制转换为响应的Http子类型
        HttpServletResponse httpResp = (HttpServletResponse) resp;
        chain.doFilter(httpReq, httpResp);//接下来要调用的过滤器或Servlet
    }

    public void destroy() {
    }

}

注:
不像监听器有许多接口,过滤器接口只有一个,即Filter

2.2 三个重要方法

每个过滤器必须实现Filter接口中的三个方法:init()、doFilter()和destroy()。

  1. init():该方法中完成调用过滤器之前的初始化工作
  2. doFilter():过滤器的主要工作在该方法中实现
  3. destroy():删除一个过滤器实例时,在该方法中完成一些清理工作

2.3 FilterChain

  1. 过滤器可以链在一起,一个接一个的运行(运行顺序由DD控制),过滤器的链尾将执行Servlet
  2. FilterChain:过滤器并不知道请求所涉及的其他过滤器,但是必须要有一个人知道过滤器执行的顺序才行,这个人就是FilterChain,它由DD中指定的filter元素驱动。FilterChain通过doFilter()方法可以调用一个过滤器或一个Servlet(取决于是否到达链尾)
  3. doFilter():该方法负责明确接下来调用谁的doFilter()方法(如果到了链尾,则是确定调用哪个Servlet的service()方法)

三、可入栈

Servlet规范并没有明确指定容器如何处理doFilter()方法,不过根据过滤器相互链接的过程,可以认为它们是栈上的方法调用(实际可能不存在这么一个物理栈)。
例如,对MyServlet的请求经过两个过滤器:一个FilterA,一个FilterB。则其出入栈过程如下:
在这里插入图片描述

四、声明和确定过滤器顺序

Web应用中可以有很多过滤器,要运行哪些过滤器以及运行的顺序都需要在DD中配置。

4.1 声明过滤器

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>MyFilter</filter-class>
    <init-param>
        <param-name>LogName</param-name>
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>LogPassWord</param-name>
        <param-value>root</param-value>
    </init-param>
</filter>
  • 必须有< filter-name >和< filter-class >
  • < init-param >是可选的,可以有多个

4.2 声明对应URL模式的过滤器映射

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
  • 必须有< filter-name >,用于链接到适当的< filter >元素
  • < url-pattern >元素定义了哪些Web应用资源要使用这个过滤器

4.3 声明对应Servlet名的过滤器映射

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <servlet-name>myServlet</servlet-name>
</filter-mapping>
  • < servlet-name >定义了哪个Web应用资源要使用这个过滤器
  • < url-pattern >、< servlet-name >二者之中必须有一个

4.4 为通过请求分派请求的Web资源声明一个过滤器映射

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>*.html</url-pattern>
    <dispatcher>REQUEST</dispatcher>
		和/或
    <dispatcher>INCLUDE</dispatcher>
		和/或
    <dispatcher>FORWARD</dispatcher>
		和/或
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

1.REQUEST表示对客户请求启用过滤器,如果没有指定< dispatcher >元素,默认为REQUEST
2. INCLUDE表示对由一个include()调用分派来的请求启用过滤器
3. FORWARD表示对由一个forward()调用分派来的请求启用过滤器
4. ERROR表示对错误处理器调用的资源启用过滤器

  • 必须要有< filter-name >
  • 必须要有< url-pattern >或< servlet-name >其中之一
  • 可以有0~4个< dispatcher >元素

4.5 过滤器顺序的确定

当多个过滤器映射到同一个给定资源时,会按照以下规则确定顺序:

  1. 先找到与URL模式匹配的所有过滤器,并按照DD中声明的顺序放入链中
  2. 把所有与URL匹配的所有过滤器放入链中后,找到与匹配的所有过滤器,并按照DD中声明的顺序放入链中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值