1、过 滤 器,目标,描述过滤器 理解过滤器生命周期 实现简单的过滤器,过滤器简介,过滤器是向 Web 应用程序的请求和响应处理添加功能的Web 服务组件 过滤器的工作原理:,Web 资源,用户发送请求,过滤器将用户的请求发送至 Web 资源,资源将响应发送至过滤器,过滤器将 Web 资源的响应发送给用户,用户,过滤器,过滤器生命周期,过滤器生命周期的各个阶段:,实例化,初始化,过滤,销毁,Filter 接口,过滤器是一个对象,它根据用户的请求和资源的响应进行过滤 Filter 接口包含以下方法:,Filter 接口,init(),doFilter(),destroy(),过滤器链,FilterC
2、hain 接口用于调用过滤器链中的一系列过滤器,用户,过滤器1,过滤器2,过滤器3,Web 资源,过滤器链,FilterConfig,在初始化过程中,容器使用 FilterConfig 将信息传递给过滤器 FilterConfig 接口包含以下方法:,getFilterName(),getInitParameter(),getInitParameterNames(),getServletContext(),FilterConfig,过滤器定义,过滤器定义用于将过滤器名称与部署描述符中的特定类关联,FilterNameClassName ,指定过滤器的名称,指定类的名称,过滤器映射,使用 元素可
3、将过滤器映射至 Web资源,如Servlet,MyFilter /servletname/* ,指定过滤器的名称,指定 Servlet 的名称,过滤器定义和映射,定义和映射过滤器 部署描述符中 和 元素的用法,FiltersModuleFilterTimer filters.TimerFilterFilterTimer /*,创建 Servlet,演示:示例 1,. out.println(“LoggerServlet“); out.println(“); out.println(“简单过滤器 Servlet“); String requestedUri = (String)request.g
4、etAttribute(“requestURI“); out.println(“请求的 URI 为: “+requestedUri); out.println(“); out.println(“); .,创建过滤器,演示:示例 2,FilterConfig、doFilter()、init() 和 destroy() 方法的用法,public class LoggerFilter extends HttpServlet implements Filter private FilterConfig filterConfig;public void init(FilterConfig filterC
5、onfig) throws ServletException this.filterConfig = filterConfig;public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) long startTime=System.currentTimeMillis();String remoteAddress=request.getRemoteAddr();String remoteHost=request.getRemoteHost();HttpServletR
6、equest myReq=(HttpServletRequest)request;String reqURI=myReq.getRequestURI();System.out.println(reqURI);,创建 HTML 文件,演示:示例 3,新文档 欢迎使用第一个过滤器示例单击此处查看过滤器的效果,实现过滤器链过滤器1,演示:示例 4,public class SimpleFilter extends HttpServlet implements Filter private FilterConfig filterConfig;public void init(FilterConfig
7、filterConfig) throws ServletException this.filterConfig = filterConfig; public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) try filterConfig.getServletContext().log(“in SimpleFilter“);System.out.println(“in SimpleFilter“);filterChain.doFilter(request, respo
8、nse);filterConfig.getServletContext().log(“Getting out of SimpleFilter“);System.out.println(“Getting out of SimpleFilter“); catch (ServletException sx) ,演示:示例 5,实现过滤器链过滤器2,public class SimpleFilter2 extends HttpServlet implements Filter private FilterConfig filterConfig; public void doFilter(Servlet
9、Request request, ServletResponse response,FilterChain filterChain) try filterConfig.getServletContext().log(“in SimpleFilter2“);System.out.println(“in SimpleFilter2“);filterChain.doFilter(request, response);filterConfig.getServletContext().log(“Getting out of SimpleFilter2“);System.out.println(“Gett
10、ing out of SimpleFilter2“); catch (ServletException sx) ,实现过滤器链web.xml,simplefiltermyfilter.SimpleFiltersimplefilter/*simplefilter2myfilter.SimpleFilter2simplefilter2/*,实现过滤器链,欢迎访问过滤器链演示程序!,创建一个html文件作为Web资源,总结,过滤器是 Web 服务组件 过滤器可以访问客户端输入的请求和 Web 资源输出的响应 过滤器定义用于将过滤器名称与特定的类关联在一起 过滤器映射用于将过滤器映射至 Web 资源 Filter 接口包含各种方法,如 init()、doFilter() 和 destroy() 每次用户发送请求或 Web 资源发送响应时都会调用 doFilter() 方法 FilterChain 接口用于调用过滤器链中的下一个过滤器 在初始化过程中,Servlet 使用 FilterConfig 将信息传递给过滤器,