过滤器filter学习1—基本认识
Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet,静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。
作用:通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:
到目标资源执行前,进行过滤
url(资源路径)
request【请求】,response【相应】
拦截:调用目标资源之前,让一段代码执行,这段代码过滤做一些特殊的操作,比如:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能
放行:调用目标资源之后,让一段代码执行,即:让目标资源得到执行
备注:如果doFilter方法里面没有:chain.doFilter(request,response);
即:任何被拦截的资源都得不到访问
图解
Filter开发分为2个步骤:
(1)编写java类实现Filter接口,并实现(三个方法)其doFilter方法。
(2)在 web.xml文件中使用
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序
init(FilterConfigfilterConfig)throws ServletException:
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法进行初始化(注:filter对象只会创建一次,init方法也只会执行一次。
开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
doFilter(ServletRequest,ServletResponse,FilterChain)
每次filter进行拦截都会执行
【chain.doFilter(request,response)放行】
在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作
destroy():
在Web容器卸载 Filter 对象之前被调用。
用户在配置filter时,可以使用
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
testFitler
org.test.TestFiter
word_file
/servlet2
通过 url-pattern或者 servlet-name都可以配置拦截的目标资源.
如果写url-pattern, 那么就是通过 配置路径 去拦截
如果写 servlet-name,那么就表示 通过 serlvet的名称 去进行拦截
以上的两种配置中, 最常用的:通过 url 路径来配置, 因为这样写代码的可读性比较高,实际开发中也推荐使用这种方式.
(1)REQUEST:
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
(2)INCLUDE:
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
(3)FORWARD:
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
(4)ERROR:
如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
过滤器拦截执行的方式