一、Filter过滤器概述
- Filtert概述
Filter技术,即过滤器技术,是Servlet三大核心技术之一。
主要用于拦截请求进行过滤操作。
可以实现权限控制、全站乱码解决、压缩响应等功能。
过滤器可以拦截对资源的访问,拦截之后,可以控制访问是否放行,如果放行还可以在访问之前或之后做一些额外的操作。
过滤器可以配置多个,多个过滤器之前采用责任链模式,依次进行拦截。只有所有过滤器都通过,才可以访问到最终的资源。
- 过滤器开发
a.开发Filter的步骤
i.写一个类实现Filter接口
ii.在web.xml中配置Filter
b.写一个类实现Filter接口
Filter接口
Method Summary | |
---|---|
void | destroy() Called by the web container to indicate to a filter that it is being taken out of service.销毁的方法,当filter在web容器中被销毁时会调用此方法 |
void | doFilter(ServletRequest request, ServletResponse response, FilterChain chain) The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.当有请求访问资源被当前过滤器拦截时,此方法执行。request 代表当前拦截下来的请求对象response代表当前拦截下来的响应对象chain代表当前整个过滤器链 提供了doFilter()方法,可以放行过滤器 |
void | init(FilterConfig filterConfig) Called by the web container to indicate to a filter that it is being placed into service.初始化的方法,当filter在web容器中被初始化时会调用此方法.filterConfig 代表当前Filter在web.xml中的配置信息 |
案例:自定义一个过滤器
package cn.tedu.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter01 implements Filter {
/**
* 服务器启动或web应用初始化时 过滤器被创建
* 创建出来之后立即调用init方法执行初始化操作
* 之后过滤器对象一直被保留在服务器内部 为后续过滤器操作服务
*
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("##MyFilter01..init..");
}
/**
* 在存活期间每次拦截到对资源的访问 都会造成doFilter方法的执行可以在这个方法中完成拦截逻辑
* 过滤器默认拦截对资源的方法不允许通过
* 可以手工调用chain.doFilter()方法来放行对资源的访问
* 放行之后执行过滤器链中的下一个过滤器,如果没有下一个过滤器就访问到目标资源
* @param request
* @param response
* @param chain
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("##MyFilter01..doFilter..");
chain.doFilter(request,response);
}
/**
* 直到服务器关闭或web应用移除出容器时
* 随着应用的销毁 过滤器对象被销毁
* 在销毁之前 执行destory方法 进行善后工作
*/
@Override
public void destroy() {
System.out.println("##MyFilter01..destory..");
}
}
c.在web.xml中配置Filter
在web.xml中配置过滤器的过程非常类似于配置一个Servlet
要通过< filter>< filter-mapping>标签实现
其中< filter-mapping>中可以通过< servlet-name>或< url-pattern>
< servlet-name>可以配置要拦截哪个名字的Servlet
< url-pattern>可以配置要拦截哪个url路径
一个web资源也可以被多个过滤器拦截,拦截顺序取决于过滤器的< filter-mapping>在web.xml中的配置顺序。
案例:配置过滤器
<!--配置过滤器-->
<filter>
<filter-name>MyFilter01</filter-name>
<filter-class>cn.tedu.filter.MyFilter01</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter01</filter-name>
<servlet-name>MyServ01</servlet-name>
<url-pattern>/MyServlet02</url-pattern>
<url-pattern>/img/*</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
-
过滤器的生命周期
当服务器启动web应用初始化时,web应用中的过滤器对象被创建出来
创建出来之后立即执行init方法进行初始化
之后一直驻留在内存中为后续的拦截进行服务
拦截到任何资源都会执行doFilter方法执行拦截
可以在doFilter方法中开发拦截逻辑
过滤器默认拦截不放行,可以通过调用FilterChain的doFilter方法来放行访问
也可以在放行之前和之后执行一些额外操作
直到web应用移除出容器时,随着web应用的销毁过滤器对象被销毁
在销毁之前会调用destory方法执行善后工作 -
多个过滤器执行过程
多个过滤器执行的先后顺序取决于过滤器的的配置顺序
先配置的先拦截先执行过滤
多个过滤器的执行过程,采用了责任链模式,非常类似于方法调用的过程,每当调用chain.doFilter()都会执行后续资源,后续资源执行过后,在返回到当前过滤器执行chain.doFilter()之后的内容。
二、FilterConfig
-
FilterConfig概述
FilterConfig是代表过滤器在web.xml中配置的对象 -
FilterConfig功能
获取过滤器名称
b.获取过滤器中配置的初始化参数
c.获取ServletContext对象