一 概念
1.Filter也称之为过滤器,它 是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html。
- 流程
- 用户访问服务器
- 过滤器对servlet请求进行拦截
- 先进入过滤器,过滤器进行处理
- 过滤器处理完后,放行,请求达到Servlet/JSP
- Servlet处理
- Servlet处理完后,再回到过滤器,最后再由tomcat服务器反馈给相应用户
二 Filter相关API
1 interface Filter
- interface Filter 过滤器核心接口
- void init 初始化方法,在服务器启动是执行
- void doFilter 过滤器拦截的业务处理方法
- void destroy 销毁过滤器实例时候调用
2 interface FilterConfig
- Enumeration getInitParameterNames() 获取多有名称
- String getInitParameter(java.lang.String name)根据名称获取相关配置
3 interface FilterChain 过滤器链参数;一个个过滤器形成一个执行链;
- void doFilter(ServletRequest request, ServletResponse response) ;执行下一个过滤器或放行
三 拦截配置
- /* 表示拦截所有的请求
<filter-mapping>
<filter-name>hello_filter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 默认拦截的类型:(直接访问或者重定向)
<dispatcher>REQUEST</dispatcher>
- 拦截转发
<dispatcher>FORWARD</dispatcher>
- 拦截包含的页面(RequestDispatcher.include(/page.jsp); 对page.jsp也执行拦截)
<dispatcher>INCLUDE</dispatcher>
- 拦截声明式异常信息:
<dispatcher>ERROR</dispatcher>
四 测试
1 .xml配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>hello_Filter</filter-name>
<filter-class>utils.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hello_Filter</filter-name>
<!--拦截所有资源-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2 过滤器
package utils;
import javax.servlet.*;
import java.io.IOException;
/**
* Created by pc on 2017/9/11.
*/
public class HelloFilter implements Filter {
public HelloFilter(){
System.out.println("1.创建过滤器实例");
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.正在执行初始化方法");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("3.执行过滤器业务处理方法");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("5.servlet处理完成回到过滤器");
}
public void destroy() {
System.out.println("6.结束过滤器");
}
}
3 Servlet
package utils;
import javax.servlet.*;
import java.io.IOException;
/**
* Created by pc on 2017/9/11.
*/
public class HelloFilter implements Filter {
public HelloFilter(){
System.out.println("1.创建过滤器实例");
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.正在执行初始化方法");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("3.执行过滤器业务处理方法");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("5.servlet处理完成回到过滤器");
}
public void destroy() {
System.out.println("6.结束过滤器");
}
}
- 服务器启动时
服务器启动时
- 访问servlet时
访问servlet
-
服务器结束时
服务器结束时