过滤器 -- Filter
过滤器:
1、所谓的过滤器, 就是拦截用户对资源的访问;
2、一个过滤器可以拦截多个资源, 一个资源也可以配置多个过滤器进行拦截;
3、其实所谓的拦截, 就是将代表请求的request对象和代表响应的response对象拦截下来进行拦截处理;在拦截后要放行不然资源将永远停留在过滤器中。
自定义一个过滤器的步骤:
(1)、创建一个class类并实现Filter接口(init、 destroy、doFilter三个方法);
(2)、配置web.xml文件;
Filter生命周期:
当服务器启动时, web应用加载后会立即创建出当前web应用中的所有的Filter对象, 创建出来后, 立即调用init方法进行初始化出操作. 从此以后这个Filter对象一直驻留在内存中为后续所拦截的请求服务, 每次过滤到对资源的访问时, 都会执行doFilter这个方法进行拦截处理, 直到服务器关闭或者web应用移出容器为止, 随着web应用的销毁, 过滤器也跟着销毁, 在销毁之前会调用destroy方法执行善后的处理。
Filter中的方法介绍
--------------------------------------------
init(FilterConfig filterConfig)
FilterConfig -- 代表当前Filter在web.xml中配置信息的对象
通过这一对象可以获取当前过滤器在web.xml配置的初始化参数
通过这一对象可以获取代表当前web应用的ServletContext对象
获取初始化参数:
getInitParameter(String name);
getInitParameterNames()
getServletContext();---获取ServletContext对象
--------------------------------------------
doFilter(request, response, FilterChian filterChian)
FilterChian -- 过滤器链
一个web资源可以被多个过滤器所拦截, 多个过滤器拦截的顺序是按照Filter在web.xml中配置的<filter-mapping>的顺序执行的。这多个过滤器按照拦截的顺序就组成了一个拦截器链, 用FilterChian表示.
如果一个过滤器处理完所拦截的请求后, 想要执行后面的拦截器, 则可以调用FilterChian上doFilter方法, 表示放行过滤器, 接着执行下一个节点
如果下一个节点仍然是过滤器, 则接着进行过滤, 执行的过程同上
如果没有后续的过滤器, 则执行真正的资源处理这次请求
--------------------------------------------
destroy()
善后处理...
配置过滤器
<filter> -- 配置一个过滤器 <filter-name>FilterDemo1</filter-name> -- 过滤器的名字 <filter-class>cn.tedu.FilterDemo1</filter-class> -- 过滤器处理类的全路径名 </filter> <filter-mapping> -- 为指定的过滤器配置要拦截的路径, 一个过滤器可以配置多个 <filter-name>FilterDemo1</filter-name> -- 过滤器的名字 <servlet-name>ServletDemo1</servlet-name> -- 拦截哪个名字的Servlet, 可以配置多个 <url-pattern>/servlet/*</url-pattern> -- 要拦截的路径, 路径的写法和Servlet的<url-pattern>写法一致, 可以配置多个 <dispatcher>REQUEST</dispatcher> -- 配置拦截哪种方式的对资源的访问, 可以取值为REQUEST/FORWARD/INCLUDE/ERROR REQUEST:默认,普通请求,最常用 FORWARD:所拦截的资源是通过请求转发访问的 INCLUDE:所拦截的资源是通过页面包含访问的 ERROR:所拦截的资源通过异常机制访问的 </filter-mapping>
总结:在请求servlet之前要先走过滤器,在返回响应之前也必先走过滤器。