JavaWeb 基础之 Filter

331 阅读2分钟

基本概念

  • Filter 过滤器,是 JavaWeb 的三大组件之一,三大组件为 : Servlet、Filter、Listener
  • 过滤器是向 Web 应用程序的请求和响应处理添加处理功能的 Web 服务组件
  • 过滤器相当于在浏览器与 Web 资源之间的一道过滤网,在访问资源之前通过过滤器对请求进行过滤、操作等,也可以对响应进行修改、判断以及拦截

使用方式

  • 自定义类实现 Filter 接口并重写 doFilter 方法
  • 在web.xml文件中配置过滤器(与配置 servlet 类似)
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    //TODO 处理逻辑
    //调用此方法代表通过此过滤器
    filterChain.doFilter(servletRequest, servletResponse);
}
<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.yamin.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

常用类

Filter接口

  • 用于描述过滤器对象,可以对资源的请求和资源的响应进行筛选操作 | 方法 | 功能 | | ----------------------------------------------------- | ---------------------- | | void init(FilterConfig filterConfig) | 实现过滤器的初始化操作 | | void doFilter(ServletRequest req,ServletResponse res) | 执行过滤操作的功能逻辑 | | void destory() | 实现过滤器的销毁操作 |

FilterConfig 接口

  • 主要用于描述过滤器的配置信息 | 方法 | 功能 | | ------------------------------------ | ------------------------ | | String getFilterName() | 获取过滤器的名字 | | String getInitParameter(String name) | 获取指定初始化的参数信息 | | Enumeration getInitParameterNames() | 获取所有的初始化参数信息 | | ServletContext getServletContext() | 获取ServletContext对象 |

过滤器链

  • 如果多个过滤器都满足过滤条件,则容器依据映射的先后顺序来调用各个过滤器,然后返回通过过滤器的顺序相反
  • 例如:三个过滤器的顺序为 1 -> 2 -> 3,返回过滤器的顺序则是 3 -> 2 -> 1
<filter-mapping>
    <filter-name>myFilter1</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>myFilter2</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>myFilter3</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>
-----→ 过 -----→  过  -----→ 过 -----→ 服                    
览         滤         虑         虑        务                                          
器  ←----- 器 ←-----  器  ←----- 器 ←----- 器
            1          2         3                              

Filter 优点

  • 实现代码的"可插拔",即使增加或者减少某个功能模块,都不会影响到系统的正常执行
  • 可以将多个相同处理逻辑的模块集中写在过滤器中,可重复利用,方便代码的维护