JavaWeb—过滤器Filter

时间:2021-09-10 04:36:51

1.Filter简介

Filter称之为过滤器,是用来做一些拦截的任务。比如客户端请求服务器的某个资源时(可以是Servlet、JSP、HTML等等),我们可以拦截。当服务器返回资源给客户端的时候,我们也可以拦截。这样我们就可以在调用资源之前和之后分别加入一些业务逻辑。

aaarticlea/png;base64,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" alt="" />

当我们对某个资源加上多个过滤器的时候,就形成了过滤链。请求(request)会依次通过链上的过滤器,响应(response)会依次以相反的顺序通过过滤器。

aaarticlea/png;base64,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" alt="" />

2.Filter源码分析

Filter接口源代码:

public interface Filter {
void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy();
}

2.1 FilterConfig

当容器去初始化一个filter的时候,就会根据web.xml文件的配置和当前的运行环境去构造一个FilterCongif实例并传给filter。所以一个filter对应一个FilterConfig实例。

aaarticlea/png;base64,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" alt="" />

public interface FilterConfig {
String getFilterName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration getInitParameterNames();
}

getFilterName方法返回我们在web.xml里面配置的名称。

getServletContext返回ServletContext实例,这个和之前介绍Servlet的时候讲到的是一个东西。一个应用就一个ServletContext实例。

getInitParameter和getInitParameterNames和Servlet的类似。就是获取在web.xml里面配置的初始化参数。

2.2 FilterChain

FilterChain就是我们上面说的过滤链,当请求或响应被filter拦截时,容器提供FilterChain实例给filter让其使用。

public interface FilterChain {
void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}

FilterChain里面就一个方法doFilter,这个方法就是调用过滤链的下一个filter,如果当前filter是链中最后的一个,则跳转至请求的资源或返回响应给客户端。

2.3 Filter

Filter里面有三个方法,也是它的生命周期。

aaarticlea/png;base64,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" alt="" />

2.3.1 init

filter的初始化方法,跟servlet一样在其生命周期内只会被执行一次。但是filter初始化的时机和servlet不一样,当servlet容器(比如Tomcat)启动完成后就会检索web.xml里面配置的filter,从上往下依次回调每个filter的init方法对其进行初始化。(这里的filterConfig参数是容器构造并传入的。)

2.3.2 doFilter

实现拦截逻辑的地方,比如一个请求被拦截,这里可以在调用具体资源之前编写一些业务逻辑。然后调用chain.doFilter流转到后置filter,如果当前filter是链中最后的一个,则跳转至请求的资源。当chain.doFilter执行完成后,可以再写一些业务逻辑。然后容器将执行权流转到前置filter,如果当前filter是链中最前的一个,则将响应返回给客户端。(这里的参数chain是容器构造并传入的。)

2.3.3 destory

和servlet的destroy方法同样的道理,当servlet容器关闭或需要更多内存的时候,会销毁filter。这个方法就使得servlet容器拥有回收资源的能力。

同样地,destroy方法在filter的生命周期中只会被调用一次。

3.Java编写Filter实例

Filter开发分为2步:

  1. 编写java类实现Filter接口,并实现其doFilter方法。
  2. 在web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

注意:web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序

Filter接口实现类

package com.xzh;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; /**
* Created by xiangzh on 2017/8/29.
*/
public class FilterDemo implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("--------Filter初始化--------"); // 获取初始化参数
String site = filterConfig.getInitParameter("param");
System.out.println("参数测试: " + site);
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("-----------方法执行前处理-----------");
// 把请求传回过滤链
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("-----------方法执行后处理-----------");
} @Override
public void destroy() {
/* 在 Filter 实例被 Web 容器从服务移除之前调用 */
}
}

web.xml配置filter

<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.xzh.FilterDemo</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>这是一个测试参数</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这里需要注意的是,filter可以对url进行过滤,也可以针对具体的servlet进行过滤,只需要制定servlet的名称,如:

<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>com.xzh.ServletDemo</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/ServletDemo</url-pattern>
</servlet-mapping> <filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.xzh.FilterDemo</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>这是一个测试参数111</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<servlet-name>ServletDemo</servlet-name>
</filter-mapping>

效果截图

JavaWeb—过滤器Filter

上例中,在web.xml中设置了参数,并在filter中获取。

结果中,init()方法初始化执行一次,doFilter()方法访问一次执行一次。

参考:

JavaWeb——Filter

Java三大器之过滤器(Filter)的工作原理和代码演示

Java中的Filter过滤器