1、Filter简介
过滤器: 对Servlet请求进行拦截
过滤器处理完后, 再放行, 此时,请求到达Servlet/JSP,执行完Servlet/jsp后,又回到过滤器,结束doFilter方法时,控制权回到服务器,返回用户响应。
2、过滤器核心API
|-- interface Filter 过滤器核心接口
Void init(filterConfig); 初始化方法,在服务器启动时候执行
Void doFilter(request,response,filterChain); 过滤器拦截的业务处理方法
Void destroy(); 销毁过滤器实例时候调用
|-- interface FilterConfig 获取初始化参数信息
String getInitParameter(java.lang.String name)
Enumeration getInitParameterNames()
|-- interface FilterChain 过滤器链参数;一个个过滤器形成一个执行链;
void doFilter(ServletRequest request, ServletResponse response) ; 执行下一个过滤器或放行
1、Filter 执行流程
- 服务器启动时创建filter并执行初始化方法init()
- 每次访问拦截资源时执行doFilter()
- doFilter中执行
chain.doFilter(request, response);
放行进入下一个Filter,或者进入Servlet,访问完Servlet又会返回到Filter,执行完doFilter()
方法然后控制权交回服务器 - 服务器关闭时销毁destory()
2、开发步骤:
- 写一个普通java类,实现Filter接口
- 配置过滤器
Demo
web.xml配置
<!-- 过滤器配置,可以配置多个过滤器,那个过滤器在前,先执行哪个 -->
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>com.wsk.a_hello_filter.HelloFilter</filter-class>
<!-- 配置初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>C:/...</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>helloFilter</filter-name>
<!-- 指定拦截类型 -->
<!-- 连接指定的Servlet -->
<servlet-name>TestServlet</servlet-name>
<!-- 拦截所有资源 -->
<url-pattern>/*</url-pattern>
<!-- 拦截指定的jsp -->
<url-pattern>/index.jsp</url-pattern>
<!-- 拦截所有jsp -->
<url-pattern>*.jsp</url-pattern>
<!-- 默认拦截类型 -->
<dispatcher>REQUEST</dispatcher>
<!-- 拦截转发 -->
<dispatcher>FORWARD</dispatcher>
<!-- 拦截包含页面 -->
<dispatcher>INCLUDE</dispatcher>
<!-- 拦截声明式异常 -->
<dispatcher>ERROR</dispatcher>
</filter-mapping>
过滤器类
public class HelloFilter implements Filter{
public HelloFilter() {
System.out.println("Filter创建");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("filter初始化");
// 这里可以获取初始化参数
// 方法一:直接使用getInitParameter()方法
String encoding = filterConfig.getInitParameter("encoding");
System.out.println("encoding:"+encoding);
// 方法二:迭代获取所有参数
Enumeration<String> enums = filterConfig.getInitParameterNames();
while(enums.hasMoreElements()){
// 获取名称
String name = enums.nextElement();
// 获取值
String value = filterConfig.getInitParameter(name);
System.out.println(name+":"+value);
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("放行");
chain.doFilter(request, response);
System.out.println("访问完Servlet,又回到Filter");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("filter销毁");
}
}