1.过滤器的概念
过滤器是一个服务器端的组件,它可以拦截客户端的请求和响应信息,并对这些信息进行过滤。
注意:1. javaWeb三大组件:Filter、Servlet、Listener
2. Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。
Servlet API中提供了一个Filter接口,如果编写额类实现了这个接口,则称这个类为过滤器。Filter接口源码如下:
package javax.servlet; import java.io.IOException; public interface Filter { public void init(FilterConfig filterConfig) throws ServletException; public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException; public void destroy(); }
接口里有三个抽象方法,分别是init() 初始化 , doFilter() 执行过滤 和destory()销毁。
2. 过滤器的特点 请记住:一般处理方式是放行,转发
1. 以常规方式调用资源(即,调用servlet或JSP页面)
2. 利用修改过的请求信息调用资源
3. 调用资源,但在发送响应到客户机前对其进行修改,修改响应
4. 阻止该资源调用,代之以转到其他的资源,返回一个特定状态代码或生成替换输出
5. 阻止资源调用,不转到其它资源(错误的情况)
3. 过滤器的生命周期
Filter的创建和销毁由WEB服务器负责。在启动tomcat的时候就行创建过滤器,并且执行init方法,完成对象的初始化。filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 每次拦截到都会去执行doFilter方法。
- 实例化———————————————–web.xml
- 初始化———————————————–init()
- 执行过滤——————————————–doFilter()
- 销毁————————————————–destory()
1.实例化,执行构造方法。 :在web.xml中对过滤器进行配置和映射,也可以使用注解@WebFilter。
2.初始化:web容器创建过滤器实例后将调用init方法,这个方法的参数FilterConfig对象可以获取web.xml文件中过滤器的初始化参数。在Filter的生命周期中,只会初始化一次。
3.执行过滤:当用户访问的URL与web.xml中url-pattern配置的值一样时,就触发这个过滤器,web容器会先调用过滤器,过滤器会调用doFilter方法,这个方法的参数FilterChain对象可以调用doFilter方法,将请求传给下一个过滤器(过滤器链的情况下)或目标资源,也可以利用重定向或转发的方式将请求转发到其他资源。在Filter的生命周期中,可以执行0到n次过滤。
4.销毁:web容器在销毁过滤器实例前调用这个方法(比如stop tomcat),在这个方法中可以释放过滤器占用的资源。在Filter的生命周期中,只会进行一次销毁。
在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。
<!--配置过滤器--> <filter> <filter-name>FilterTest</filter-name> <filter-class>com.codeliu.FilterTest</filter-class> //类的全限定名(通过反射去创建这个过滤器对象)
<init—param> //可选 <param—name>参数名</param-name>//过滤器初始化参数 <param-value>参数值</param-value> </init—pamm> </filter> <!--映射过滤器--> <filter-mapping> <filter-name>FilterTest</filter-name> <url-pattern>/*</url-pattern>
<dispatcher>请求的类型</dispatcher> </filter-mapping>
在配置中需要注意的有三处:<filter-class>(类的全限定名(通过反射去创建这个过滤器对象)
<url-pattren>要拦截的资源路径
<dispatcher>请求的类型
<url-pattren>一般有以下规则:
1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。
2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>
3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。
4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>
如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。
<filter> <filter-name>loginFilter</filter-name> <filter-class>com.ygj.control.loginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
<dispatcher>请求的类型,四个取值,分别为 REQUEST | INCLUDE | ORWARD | ERROR,不填时默认为 REQUEST。
- REQUEST:当用户直接访问页面时,web容器将会调用过滤器,如果目标资源是通过请求转发(request.getRequestDisPatcher)的include方法或forward方法进行访问,那么该过滤器就不会被调用。
- INCLUDE:如果目标资源是通过request.getRequestDisPatcher的include方法进行访问,那么该过滤器将会被调用,其他情况下,不会被调用。
- FORWAED:如果目标资源是通过request.getRequestDisPatcher的forward方法进行访问,那么该过滤器将会被调用,其他情况下,不会被调用。
- ERROR:如果目标资源是通过声明或异常处理机制调用,那么该过滤器将会被调用,除此之外,不会被调用。
使用注解的方式
@WebFilter(urlPatterns = {"/*"}, initParams = {@WebInitParam(name = "noFilterPath", value = "login.jsp;LoginServlet;fail.jsp", description = "不触发该过滤器的页面"), @WebInitParam(name = "charset", value = "UTF-8")})
原文地址:https://www.cnblogs.com/gshao/p/10356047.html