过滤器
1、Filter:
概述:
Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,
对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截,
从而实现一些特殊的功能。
Filter就是过滤从客户端向服务器发送的请求。
2、FilterChain:
FilterChain过滤器链:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链。
Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用那个Filter。依次调用后面的过滤器,
如果没有下一个过滤器,调用目标资源 (注意)
3、Filter生命周期:
Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。
并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。
每次filter进行拦截的时候,都会执行doFilter的方法。
当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象。
4、FilterConfig对象:
作用:用来获得Filter的相关的配置的对象。
常用的方法:
getFilterName() ----获取过滤器名称
getInitParameter ----获取初始化参数
getInitParameterNames() -----获取所有初始化参数名称
5、过滤器的相关配置(web.xml文件中的配置):
1、<url-pattern>的配置:则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。
完全路径匹配 :以/开始 比如/aaa /aaa/bbb
目录匹配 :以/开始 以*结束 比如/* /aaa/* /aaa/bbb/*
扩展名匹配 :不能以/开始 以*开始 比如*.jsp *.do *.action
如:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>
2、<servlet-name>的配置:
专门以Servlet的配置的名称拦截Servlet。
3、<dispatcher>的配置:
默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。
dispatcher的取值:
REQUEST :默认值。默认过滤器拦截的就是请求。
FORWARD :转发。
INCLUDE :页面包含的时候进行拦截
ERROR :页面出现全局错误页面跳转的时候进行拦截
6、使用方式:
1、创建一个class后,实现接口Filter(注意:是javax.servlet中的Filter)。
2、重写过滤器的doFilter(request,response,chain)方法。另外两个init()、destroy()方法一般不需要重写。
在doFilter方法中进行过滤操作。
常用代码有:获取请求、获取响应、获取session、放行。
代码:
public class FilterDemo3 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 {
System.out.println("FilterDemo3执行了...");
//放行
chain.doFilter(request, response);
System.out.println("FilterDemo3执行结束了...");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
3、在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。
也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。
<filter>
<filter-name>loginFilter</filter-name>//过滤器名称
<filter-class>com.ygj.control.loginFilter</filter-class>//过滤器类的包路径
<init—param> //可选
<param—name>参数名</param-name>//过滤器初始化参数
<param-value>参数值</param-value>
</init—pamm>
</filter>
<filter-mapping>//过滤器映射
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<url—pattern>指定过滤器作用的对象</url-pattern>