web过虑器

    |     2016年12月2日   |   Servlet与Jsp   |     0 条评论   |    1857

过滤器(Filter)是服务端实现 javax.servlet.Filter 的 Java 类,用来截取客户端请求和服务器响应。它可以在请求到达后端资源之前拦截,也可以在响应写回客户端之前再处理一遍。

配置写在 web.xml:生命周期是实例化 → init() → 多次 doFilter() → destroy()。多个过滤器会按映射顺序组成过滤链。

和监听器不同,过滤器一定要调用 chain.doFilter() 才能把请求交给下一个环节;不调用就等于截断。

一、过滤器定义

  • 在客户端请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

二、工作原理

20161202104427

请求进入容器后,先经过过滤器链,再到达 Servlet / JSP;响应沿原路返回,过滤器可以在返回路径上再次加工。

三、过滤器配置与生命周期

实例化     web.xml 加载时
初始化     init()
过滤       doFilter()   // 每个匹配请求都会进
销毁       destroy()

web.xml 各节点含义:

<filter>                 指定一个过滤器
  <filter-name>          过滤器名字,不能为空
  <filter-class>         完整限定类名
  <init-param>           初始化参数;子元素 param-name / param-value
                         代码里用 FilterConfig 读取
<filter-mapping>         该 Filter 拦截哪些资源
  <filter-name>          必须对应上面声明过的名字
  <url-pattern>          拦截的请求路径
  <servlet-name>         或按 Servlet 名称拦截

过滤器类最小骨架:

public class LoginFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        // place your code here
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }
}

对应的 web.xml 配置(两个过滤器都映射 /*):

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.ittx.test.LoginFilter</filter-class>
    <init-param>
        <param-name>test-param</param-name>
        <param-value>Initialization Paramter</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>AuthenFilter</filter-name>
    <filter-class>com.ittx.test.AuthenFilter</filter-class>
    <init-param>
        <param-name>test-param</param-name>
        <param-value>Initialization Paramter</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>AuthenFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

四、过滤链

一个 Web 请求可以定义多个过滤器,它们按声明顺序组装成一条过滤链。

20161202105130

五、过滤器分类

用 <dispatcher> 指定资源被容器调用的方式,可以是 REQUEST、INCLUDE、FORWARD、ERROR 之一,默认 REQUEST。也可以写多个子元素,让同一个 Filter 拦截多种调用方式。

dispatcher 何时调用 其他情况
REQUEST 用户直接访问页面 include / forward 过去的请求不会进这个过滤器
INCLUDE 目标由 RequestDispatcher.include() 访问 除此之外不调用
FORWARD 目标由 RequestDispatcher.forward() 访问 除此之外不调用
ERROR 声明式异常处理机制转到该资源 除此之外不调用

Web 监听器参见:如何使用监听器Servlet。

一句话总结:过滤器卡在请求前后:记得 chain.doFilter(),并用 dispatcher 分清直接访问、转发、包含和错误页。

转载请注明来源:web过虑器
本文链接地址:https://ai.zhousir.top/?p=1791
回复 取消