1. Filter简介
- Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能。
- 在Servlet API中定义了三个接口类来供开发人员编写Filter程序:Filter,FilterChain,FilterConfig
- Filter程序是一个实现了Filter接口的Java类,与Servlet程序相似,它由Servlet容器进行调用和执行
- Filter程序需要在Web.xml文件中进行配置和映射
- 与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口
2. 创建一个Filter的过程
- 创建一个Filter类,实现Filter接口
- 在web.xml文件中配置并映射该Filter类,其中url-pattern指定该Filter可以拦截哪些资源,即可以通过哪些url访问到该Filter
配置的demo:
<!-- 注册Filter -->
<!-- 可以注册和映射多个Filter-->
<filter>
<filter-name>HelloFilters</filter-name>
<filter-class>HelloFilter</filter-class>
</filter>
<!-- 映射Filter -->
<filter-mapping>
<filter-name>HelloFilters</filter-name>
<!-- 要拦截的资源 -->
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
3. 相关API
(1).init:类似于Servlet的init方法,在创建Filter对象(Filter对象在Servlet容器加载当前WEB应用时即被创建)后,立即被调用,且==只被调用一次==。该方法用于对当前的Filter进行初始化操作。Filter实例是单例的
//FilterConfig类似于ServletConfig,可以在web.xml文件中配置当前 Filter的初始化参数,配置方式也和Servlet类似
public void init(FilterConfig filterConfig);
在web.xml中配置当前Filter的初始化参数实例如下:
<filter>
<filter-name>HelloFilters</filter-name>
<filter-class>HelloFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>root</param-value>
</init-param>
</filter>
(2).doFilter:真正Filter的逻辑代码需要编写在该方法中,每次拦截都会调用该方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain);
//FilterChain接口:
//Filter链,多个Filter可以构成一个Filter链
//FilterChain有一个方法:doFilter(ServletRequest request,ServletResponse response):把请求传给Filter链的下一个
//若当前Filter是Filter链的最后一个Filert,则把请求给到目标Servlet(或JSP)
//多个Filter拦截的顺序和与他们在应用程序的web.xml中映射的顺序一致(靠前的先被拦截)
demo:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("do");
//把请求传给Filter链的下一个,如果是最后一个,则把请求给到目标Servlet(或JSP)
filterChain.doFilter(servletRequest,servletResponse);
}
(3). destroy:释放当前Filter所占用的资源的方法,在Filtet被销毁之前被调用,且只被调用一次。
public void destroy();
网友评论