Filter基础
- Filter:
1)Filter是什么?
① javaWeb的一个重要的组件,可以对发送到Servlet的请求进行拦截,并对响应也进行拦截。
②Filter是实现了Filter接口的Java类
③Filter需要在Web.xml文件中进行配置和映射
2)如何创建一个Filter,并运行
①创建一个Filter类:实现Filter接口
public class myFilter implements Filter
②在web.xml文件配置并映射Filter,其中url-pattern指定可以拦截哪些资源,即可以通过哪些url访问到Filter
<!-- 注册Filter -->
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>com.stupid.filter.test.myFilter</filter-class>
</filter>
<!-- 映射Filter -->
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
<dispatcher> 元素,指定过滤器所拦截的资源被Servlet容器调用的方式。默认为REQUEST。可以设置多个
<dispatcher>REQUEST</dispatcher> st//用户直接访问页面时,post或者get方法
<dispatcher>ERROR</dispatcher>//如果目标时通过声明式异常处理机制调用时,该过滤器会被调用
<dispatcher>FORWARD</dispatcher>//如果目标时通过转发的方法访问的
<dispatcher>INCLUDE</dispatcher>//如果目标时通过包含访问的,RequestDispatcher().include()方法访问的页面
</filter-mapping>
- Filter相关的API
@Override
public void destroy() {
System.out.println("destroy");
//释放当前Filter所占用的资源,在Filter被销毁之前被调用,且只被调用一次
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("doFilter");
//真正Filter的逻辑代码需要编写在该方法中,每次拦截都会调用该方法
//FilterChain:Filter链,多个Filter可以构成一个Filter链
// 放行
chain.doFilter(request, response);
// doFilter(ServletRequest request, ServletResponse response) :把请求传给Filter链的下一个Filter,若当前Filter是Filter链中的最后一个Filter,将把请求给目标的Servlet或JSP
//多个Filter的拦截顺序和<filter-mapping>配置的顺序有关,靠前的先被调用
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("init");
//类似于Serlvet的init方法,在创建Filter对象后,立即被调用,且只调用一次。该方法用于对当前的Filter进行初始化操作,Filter实例是单例的
//FilterConfig 类似于ServletConfig
//可以在web.xml文件中配置当前Filter的初始化参数,配置方式也和Servlet类似
}