过滤器 Filter
Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能
当浏览器访问服务器中的目标资源时,会被Filter拦截,在Filter中进行预处理操作,然后再将请求转发给目标资源。当服务器接收到这个请求后会对其进行响应,在服务器处理响应的过程中,也需要先将响应结果发送给拦截器,在拦截器中对响应结果进行处理后,才会发送给客户端。
Filter过滤器就是一个实现了javax.servlet.Filter接口的类,在javax.servlet.Filter接口中定义了三个方法
(1)init
(2)FilterConfig
(3)filterConfig
初始化的时候执行,只调用一次
例子:
建立项目15Filterdemo,建立com.jike.filter包
(1)首先建立一个servlet --Myservlet
(2)配置servlet
运行一下http://localhost:8080/15Filterdemo1class/MyServlet
(3)建立过滤器的类---MyFilter 要去实现Filter接口
(4)配置过滤器,在web.xml中去配置
运行一下http://localhost:8080/15Filterdemo1class/MyServlet
说明这个过滤器拦截了myServlet
作用:1实现自动登录,2实现这个网站的统一编码
Filter映射
Filter的映射方式可分为两种
拦截用户所有请求 用*表示
<filter>
<display-name>MyFilter</display-name>
<filter-name>MyFilter</filter-name> <filter-class>com.jike.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截不同方式请求
<filter-mapping>元素中有一个特殊的子元素<dispatcher>,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式
- Request方式:“当用户直接访问页面时,web容器就会调用过滤器,如果目标资源是通过request Dispatch的include()或者forward()方法访问的,”
- Include 如果目标资源是通过request。 Dispatch的include()方法访问的
- Forward 如果目标资源是通过request Dispatch的forward()方法访问的,
- Error 如果目标资源是通过声明异常处理机制调用的,那么该过滤器就会被调用。
Forward方式来做个例子
在包中 建立ForwardServlet。
(5)建立first.jsp
(6)建立过滤器 ForwardFilter
(7)配置过滤器 web.xml中
http://localhost:8080/15Filterdemo1class/ForwardServlet
注意:如果不加<dispatcher>FORWARD</dispatcher>,则访问页面的时候是不拦截的,结果是
Filter链
如果多个过滤器对某一个资源都进行了过滤,那么,这些过滤器就形成了过滤器链
例子:过滤器链怎么用
在包里建立Myfilter1
再建立MyFilter2
配置,让这两个过滤器都对前面建立的Myservlet进行过滤
http://localhost:8080/15Filterdemo1class/MyServlet