刚学的javaweb中的Filter(过滤器技术), 此技术是用来拦截及过滤掉一些请求和返回的信息。Filter过滤器在整个web应用中可以简要地有下图进行解释:
Filter会对request和response的数据进行过滤,在tomcat服务器中,给应用配一个过滤器,首先需
要编写一个类,此类实现了Filter接口的三个方法
public void destroy();//web容器卸载Filter之前调用,主要是用来释放一些资源等操作,该方法在Filter生命周期中只执行一次
public void init(FilterConfig config) //初始化Filter,创建一个Filter对象实例,只会创建一个对象实例,同时这个方法只会在web服务器启动时执行,且只执行一次,主要是用来做一些初始化操作。
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain arg2); //此操作时过滤器的主体,对任务的拦截操作都在此进行
注册Filter
写完一个过滤器后,还需要在web.xml配置文件里将此Filter配上,此Filter在web服务器启动加载此web应用时,才会生效。配置主要涉及几个标签:
<filter>
<filter-name>FilterUtils</filter-name> <!--Filter name,需要在写filter-class前 -->
<filter-class>cn.itcast.utils.FilterUtils</filter-class> <!--Filter类路径 -->
</filter>
<filter-mapping>
<filter-name>FilterUtils</filter-name>
<url-pattern>/*</url-pattern> <!--定义拦截内容,此处为拦截任何访问 -->
<dispatcher>REQUEST</dispatcher> <!--定义拦截方式,默认为request,即对request方式进行拦截,对FORWARD不进行拦截,需要大写 -->
</filter-mapping>
此配置文件中可以配置多个Filter,每个Filter的执行顺序为Filter在web.xml配置文件中的先后顺序。
这些过滤将会绑到一个FilterChain对象中,形成一个Filter链。当第一个Filter的doFilter()方法被调用时
Web服务器将会创建一个FilterChain对象传递给doFilter方法,调用FilterChain对象的doFilter()方法,
web服务器会检查FilterChain链是否还有filter,要是有就调用下一个filter,否则访问指定的web资源。
Fileter的生命周期,Filter的生命周期伴随整个服务器(或者说是此WEB应用的生命周期),服务器启动时,此Filter将被创建,当此web应用关闭时,此Filter将会被摧毁,整个web应用中,每种类型的Filter只会生成一个实体。
下面是一个小小Demo
//过滤器
public class FilterUtils implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destory...."); //服务器关闭时执行
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("do Filter....");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init...."); //服务器启动时,执行
}
}
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>FilterServlet</servlet-name>
<servlet-class>cn.itcast.web.controller.FilterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FilterServlet</servlet-name>
<url-pattern>/servlet/FilterServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>FilterUtils</filter-name>
<filter-class>cn.itcast.utils.FilterUtils</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterUtils</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
//servlet
public class FilterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("servlet....");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}