l Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截
l 调用目标资源之前,让一段代码执行
l 是否调用目标资源(即是否让用户访问web资源)。
l web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
l 调用目标资源之后,让一段代码执行
l Filter开发分为二个步骤:
• 编写java类实现Filter接口,并实现(三个方法)其doFilter方法。
• 在 web.xml 文件中使用
l Filter链 ---FilterChain
• 在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
• web服务器根据Filter在web.xml文件中的注册顺序
• Filter链实验(查看filterChainAPI文档)
l init(FilterConfig filterConfig)throws ServletException:
• 和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法进行初始化(注:filter对象只会创建一次,init方法也只会执行一次。示例 )
• 开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。(filterConfig对象见下页PPT)
l doFilter(ServletRequest,ServletResponse,FilterChain)
• 每次filter进行拦截都会执行
• 在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作
l destroy():
• 在Web容器卸载 Filter 对象之前被调用。
l 用户在配置filter时,可以使用
• String getFilterName():得到filter的名称。
• String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
• Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
• public ServletContext getServletContext():返回Servlet上下文对象的引用。
注册
l
l
l
映射Filter
l
•
•
•
•
•
• REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
• INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
• FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
• ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。