一:Filter链
在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个 Filter 链(也叫过滤器链) Filter 链用 FilterChain 对象来表示, FilterChain 对象中有一个 doFilter ()方法,该方法的作用就是让 Fiter 链上的当前过滤器放行,使请求进入下一个 Filter 。接下来通过一个图例来描述 Filter 链的拦截过程,如图 所示
在图8-6中,当浏览器访问 Web 服务器中的资源时需要经过两个过滤器Filter1和Filter2。首先Filer1会对这个请求进行拦截,在Filter1过滤器中处理好请求后,通过调用Filter1的 doFilter ()方法将请求传递给Fiter2.Filter2将用户请求处理后同样调用 doFilter ()方法 最终将请求发送给目标资源。当 Web 服务器对这个请求做出响应时,也会被过滤器拦截,这个拦截顺序与之前相反,最终将响应结果发送给客户端。
(1)在chapter08项目的 cn . itcast .chapter08.filter包中新建两个过述器MyFilter01和MyFilter02,
MyFilter01.java
package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
public class MyFilter01 implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用,可以配置一些初始化参数
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriter out=response.getWriter();
out.write("Hello MyFilter01<br />");
chain.doFilter(request, response);
}
public void destroy() {
// 过滤器对象在销毁时自动调用,释放资源
}
}
MyFilter02.java
package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.Filter;
import javax.servlet.*;
public class MyFilter02 implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用,可以配置一些初始化参数
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriter out=response.getWriter();
out.write("MyFilter02 Before<br />");
chain.doFilter(request, response);
out.write("<br />MyFilter02 After<br />");
}
public void destroy() {
// 过滤器对象在销毁时自动调用,释放资源
}
}
为了防止其他过滤器影响此次 Filter 链的演示效果,请先在 web . xml 文件中注释掉其他过滤器的配置信息。然后,将MyFiter01和MyFilter02过滤器的映射信息配置在 MyServlet 配置信息前面
<filter>
<filter-name>MyFilter01</filter-name>
<filter-class>cn.itcast.chapter009.filter.MyFilter01</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter01</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
<filter>
<filter-name>MyFilter02</filter-name>
<filter-class>cn.itcast.chapter08.filter.MyFilter02</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter02</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
<servlet>
<description></description>
<display-name>MyServlet</display-name>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.chapter08.filter.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url