一.Filter的简介
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理
二、编写步骤
- 编写一个过滤器的类实现Filter接口
- 实现接口中尚未实现的方法
- 在
web.xml
中进行配置(主要是配置要对哪些资源进行过滤)
案例:
第一步:实现接口,重写方法
public class QuickFilter1 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("quick1 running...");
//放行请求
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
第二步:配置web.xml
文件
<filter>
<filter-name>QuickFilter1</filter-name>
<filter-class>com.filter.filter.QuickFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>QuickFilter1</filter-name>
<!--对该web应用下的所有的资源进行过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
第三步:书写一个Servlet进行测试
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Servlet1 running...");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注意:
chain.doFilter(request, response)
如果我们不写这段代码我们就无法访问到Servlet1当中的内容,如果我们书写了这段代码,那么我们会如愿访问到Servlet1里面的内容。此为放行请求。
三、Filter的访问流程
我们在配置<url-pattern>/*</url-pattern>
时,会对我们整个web应用下进行过滤。实际上我们在访问Servlet时,会经过多个过滤器,多个filter会形成一个链状,如果想要均通过这些。都需要进行上面的chain.doFilter(request,response)
进行放行。
四.Filter生命周期及API详解
1.Filter生命周期及其与生命周期相关的方法
Filter接口有三个方法:
init(Filterconfig)
:代表filter对象初始化方法 filter对象创建时执行doFilter(ServletRequest,ServletResponse,FilterChain)
:代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法destory()
:代表是filter销毁方法 当filter对象销毁时执行该方法
2.Filter对象的生命周期:
- Filter何时创建:服务器启动时就创建该Filter对象
- Filter何时销毁:服务器关闭时Filter销毁
3.Filter的API详解
init(FilterConfig)方法
其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息。
案例:
第一步:先写一些web.xml
内容
<filter>
<filter-name>QuickFilter1</filter-name>
<filter-class>com.filter.filter.QuickFilter1</filter-class>
<init-param>
<param-name>aaa</param-name>
<param-value>AAA</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>QuickFilter1</filter-name>
<!--对该web应用下的所有的资源进行过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
第二步:用init方法获取web.xml的中的信息
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获得web.xml中的filter的名称——————
//<filter-name>QuickFilter1</filter-name>
filterConfig.getFilterName();
//获得当前filter的初始化参数
filterConfig.getInitParameter("aaa");
//获得ServletContext
filterConfig.getServletContext();
}
-
destory()方法
filter对象销毁时执行,关闭服务器即可执行。 -
doFilter方法
doFilter(ServletRequest,ServletResponse,FilterChain)
其中的参数: -
ServletRequest/ServletResponse
:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。 -
FilterChain
:过滤器链对象,通过该对象的doFilter方法可以放行该请求。他会把我们的filter对象放到一个FilterChain对象里面。其过滤器的顺序,是根据书写的web.xml当中的的顺序去执行过滤器
案例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Filter</display-name>
<filter>
<filter-name>QuickFilter1</filter-name>
<filter-class>com.filter.filter.QuickFilter1</filter-class>
<init-param>
<param-name>aaa</param-name>
<param-value>AAA</param-value>
</init-param>
</filter>
<!-- 注意此处的filter-mapping-->
<filter-mapping>
<filter-name>QuickFilter1</filter-name>
<!--对该web应用下的所有的资源进行过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 注意此处的filter-mapping-->
<filter>
<filter-name>QuickFilter2</filter-name>
<filter-class>com.filter.filter.QuickFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>QuickFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
注意:
该web.xml中 QuickFilter1的<filter-mapping>
在QuickFilter2的<filter-mapping>
的前面。故使用过滤器的时候会先过滤filter1再过滤filter2。
如图:
4.Filter的web.xml配置文件
我们再url-pattern配置时,有三种写法:
- 完全匹配 :/sertvle1
- 目录匹配 :/aaa/bbb/*
- 扩展名匹配:*.abc *.jsp
注意:url-pattern可以使用servlet-name替代,也可以混用
如下:
<filter-mapping>
<filter-name>QuickFilter1</filter-name>
<!--对该web应用下的所有的资源进行过滤 -->
<!-- <url-pattern>/*</url-pattern> -->
<servlet-name>Servlet1</servlet-name>
</filter-mapping>
Filter还有另外一个配置方式:
dispatcher
REQUEST
:默认值,代表直接访问某个资源时执行filterFORWARD
:转发时才执行filterINCLUDE
: 包含资源时执行filterERROR
:发生错误时 进行跳转是执行filter
如下:
<filter-mapping>
<filter-name>QuickFilter1</filter-name>
<!--对该web应用下的所有的资源进行过滤 -->
<!-- <url-pattern>/*</url-pattern> -->
<!-- <servlet-name>/Servlet1</servlet-name> -->
<url-pattern>/*</url-pattern>
<dispatcher>可以再次进行上述配置</dispatcher>
</filter-mapping>