4.12过滤器

 过滤器可以在请求到达servlet之前和servlet响应客户端之前进⾏拦截,相当于⼀个拦截器。主要⽤于进⾏⼀些请求和响应的预处理操作。常⽤的场景有权限的控制、统⼀字符编码等等。

4.12.1 编写过滤器


要实现⼀个过滤器,必须实现⼀个FIlter接⼝,只有实现了这个接⼝的类才称之为过滤器。

示例代码:

public class DemoFilter implements Filter {
...
}
 

web.xml配置过滤器:
<
filter>
<filter-name>
demoFilter</filter-name>
<filterclass>
edu.nf.ch09.filter.DemoFilter</filter
-class>


<!-- 初始化参数 -->
<init-param>
<param-name>
param</param-name>
<param-value>
hello</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>
demoFilter</filter-name>
<!--
什么请求可以经过此过滤器, /*表示所有
请求
-->
<url-pattern>/*</url-pattern>
</filter-mapping>


4.12.2 过滤器的⽣命周期
Servlet类似, Filter同样也是容器负责创建和销毁,与Servlet的区别在于,容器会在启动的时候最先创建所有的过滤器,并执⾏init⽅法进⾏初始化。
 

⽣命周期⽅法:

⽅法 说明
init 初始化⽅法,容器启动时执⾏⼀次
doFilter 请求过滤⽅法,决定请求是否放⾏
destroy 容器销毁过滤器之前执⾏的⽅法


代码实例: 


public class DemoFilter implements Filter{
@Override
public void destroy() {
System.out.println("
准备销毁
DemoFilter");
}
@Override
public void doFilter(ServletRequest
request
, ServletResponse response,
FilterChain chain)
throws IOException,
ServletException {
//FilterChain
表示⼀个过滤链对象,因为
过滤器可能会存在多个
//同时这个对象将决定是否放⾏当前请求,
//放⾏的话则请求会继续到达下⼀个过滤器
或者
servlet
System.out.println("请求经过
DemoFileer..放⾏");
chain.doFilter(request, response);


System.out.println("响应前经过
DemoFilter...");
}
@Override
public void init(FilterConfig config)
throws ServletException {
String name =
config.getInitParameter("param");
System.out.println("
初始化
DemoFilter,获取初始化参数: "+name);
}
}
 


4.12.3 过滤链

在⼀个web项⽬中可能存在多个过滤器,当有多个过滤器存在的时候就会形成⼀个过滤链。请求会按照过滤器链的顺序⼀直传递下去,最终到达某个Servlet来处理请求。(注意:过滤链的顺序是按照web.xml中的先后配置顺序决定的)

  配置示例:

<!-- 按先后顺序配置 -->
<!--
配置第⼀个过滤器 -->
<filter>


<filter-name>firstFilter</filter-name>
<filterclass>
edu.nf.ch09.filter.FirstFilter</filte
r-class>
</filter>
<filter-mapping>
<filter-name>
firstFilter</filter-name>
<url-pattern>
/*</url-pattern>
</filter-mapping>
<!--
配置第⼆个过滤器-->
<filter>
<filter-name>
secondFilter</filter-name>
<filterclass>
edu.nf.ch09.filter.SecondFilter</filt
er-class>
</filter>
<filter-mapping>
<filter-name>
secondFilter</filter-name>
<url-pattern>
/*</url-pattern>
</filter-mapping>




猜你喜欢

转载自blog.csdn.net/zhangguoqin66/article/details/80964797