过滤器Filter的基本概述
Filter:客户端访问Web资源时,可以进行请求和响应的拦截,
如果条件成立,才可以让客户端访问Web资源
如果条件不成立,不可以让客户端访问Web资源
可用于全站字符编码统一,权限控制,,,
开发Filter简单步骤
1 创建一个JavaWeb工程
2 创建一个普通Java类,去实现Filter接口
public class MyFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { System.out.println("aaaaa"); //将请求放行,继续访问index.jsp chain.doFilter(req,res); System.out.println("bbbbb"); } @Override public void init(FilterConfig arg0) throws ServletException { } } |
3 在web.xml文件中对Filter进行配置
<!-- Filter基本信息 --> <filter> <!-- Filter取一个别名 --> <filter-name>MyFilter</filter-name> <!-- Filter的全名(包名+类名) --> <filter-class>com.aaa.filter.MyFilter</filter-class> </filter>
<!-- Filter过滤信息 --> <filter-mapping> <!-- Filter取一个别名,同上 --> <filter-name>MyFilter</filter-name> <!-- Filter的过滤路径,如你们访问我的index.jsp时,Filter就会进行过滤或拦截,配个/*所有请求都过滤 --> <url-pattern>/index.jsp</url-pattern> </filter-mapping> |
Filter的生命周期
Filter:
无参构造器->init(),在web服务器启动时执行,且只执行一次
doFilter,当Filter需要过滤web.xml文件中配置的路径时,这时
doFilter会执行,可以执行N次
当Web服务器决定不要Filter了,就将Filter删除,在删除前先执行
destroy方法,且一个Filter只执行一次。
无参构造器,init(),destroy(),只执行一次
doFilter()方法可以执行0次或N次
Filter也是一个单例模式的
四种过滤类型
REQUEST:直接访问to.jsp时,Filter会进行拦截,除此之外,Filter不会进行拦截
这种过滤类型是默认类型,可以在web.xml文件中不用配置
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> |
FORWARD:只有在转发时,Filter会拦截,除此之外,Filter不会进行拦截
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 过滤类型 --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> |
INCLUDE:只有在包含时,Filter会拦截,除此之外,Filter不会进行拦截
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 过滤类型 --> <dispatcher>REQUEST</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> |
ERROR:如有发生了错误信息,且在web.xml文件中声明了,Filter会拦截,
除此之外,Filter不会进行拦截
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 过滤类型 --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> |
默认是REQUEST
如果多个Filter同时过滤同一种<url-pattern>的话,我们将这些Filter组成一个集合,
它们都在同一个链条上,这个链条就叫过滤器链。