使用Servlet过滤器n教学目标n了解Servlet过滤器的概念n了解Servlet过滤器的工作过程n掌握创建Servlet过滤器的方法n掌握发布Servlet过滤器的方法PDF文件使用pdfFactory试用版本创建中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。nServlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。nServlet过滤器能够在Servlet被调用之前检查Request对象,修改RequestHeader和Request内容;n在Servlet被调用之后检查Response对象,修改ResponseHeader和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。PDF文件使用pdfFactory试用版本创建接口。这个接口含有3个过滤器类必须实现的方法:ninit()ndoFilter()ndestroy()PDF文件使用pdfFactory试用版本创建(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数ndoFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器ndestroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源PDF文件使用pdfFactory试用版本创建过滤器,它可以拒绝列在黑名单上的客户访问留言簿,而且能将服务器响应客户请求所花的时间写入日志。n参考NoteFilter.javaPDF文件使用pdfFactory试用版本创建初始化时,它调用config.getInitParameter(blacklist)方法,从web.xml文件中读取初始化参数blacklist,这个参数表示被禁止访问留言簿的客户黑名单。publicvoidinit(FilterConfigconfig)throwsServletException{this.config=config;blackList=config.getInitParameter(blacklist);}PDF文件使用pdfFactory试用版本创建()方法中首先从request对象中读取客户姓名,然后将客户姓名转换为中文字符编码。如果客户姓名中包含黑名单里的字符串,那么将直接向客户端返回一个拒绝网页。由于在这种情况下没有调用chain.doFilter()方法,因此客户请求不会到达所访问的Web组件。PDF文件使用pdfFactory试用版本创建过滤器//获得username请求参数,进行字符编码转换Stringusername=((HttpServletRequest)request).getParameter(username);if(username!=null)username=newString(username.getBytes(ISO-8859-1),GB2312);PDF文件使用pdfFactory试用版本创建过滤器//进行身份验证if(username!=null&&username.indexOf(blackList)!=-1){response.setContentType(text/html;charset=GB2312);PrintWriterout=response.getWriter();out.println(htmlhead/headbody);out.println(“h1对不起,”+username+“,你没有权限留言/h1);out.println(/body/html);out.flush();return;}PDF文件使用pdfFactory试用版本创建假定姓名中包含“捣蛋鬼”字符串的客户将被禁止访问留言簿,并且留言簿由NoteServlet类来实现,当名叫“捣蛋鬼2000”的客户访问留言簿时,将被NoteFilter过滤器拒绝访问。PDF文件使用pdfFactory试用版本创建请求当名叫“捣蛋鬼2000”的客户访问留言簿时NoteFilter的工作流程PDF文件使用pdfFactory试用版本创建如果客户名不在黑名单里,NoteFilter的doFilter方法就会调用chain.doFilter()方法,这个方法用于调用过滤器链中后续过滤器的doFilter()方法。n假如没有后续过滤器,那么就把客户请求传给相应的Web组件。n在本例中,在调用chain.doFilter()方法前后都生成了一些日志,并且记录了调用chain.doFilter()方法前后的时间,从而计算出Web组件响应客户请求所花的时间。PDF文件使用pdfFactory试用版本创建=System.currentTimeMillis();config.getServletContext().log(NoteFilter:beforecallchain.doFilter());chain.doFilter(request,response);config.getServletContext().log(NoteFilter:aftercallchain.doFilter());longafter=System.currentTimeMillis();Stringname=;if(requestinstanceofHttpServletRequest){name=((HttpServletRequest)request).getRequestURI();}config.getServletContext().log(NoteFilter:+name+:+(after-before)+ms);PDF文件使用pdfFactory试用版本创建请求当名叫“小精灵”的客户访问留言簿时NoteFilter的工作流程日志文件位于CATALINA_HOME\logs目录下PDF文件使用pdfFactory试用版本创建过滤器时,必须在web.xml文件中加入filter元素和filter-mapping元素。filter元素用来定义一个过滤器:filterfilter-nameNoteFilter/filter-namefilter-classNoteFilter/filter-classinit-paramparam-nameblacklist/param-nameparam-value捣蛋鬼/param-value/init-param/filterPDF文件使用pdfFactory试用版本创建关联:filter-mappingfilter-nameNoteFilter/filter-nameurl-pattern/note/url-pattern/filter-mapping提示:在web.xml文件中,必须先配置Servlet过滤器,再配置ServletPDF文件使用pdfFactory试用版本创建,它实现一个简单的留言簿。它提供了一个表单,让客户输入姓名和留言,客户提交表单后,再将用户输入的信息显示在客户端的网页上。n访问NoteServlet:文件使用pdfFactory试用版本创建文件使用pdfFactory试用版本创建问题:在Servlet过滤器中能否访问application范围内的共享数据?n答案:可以的,先调用FilterConfig的getServletContext()方法获得ServletContext,再调用ServletContext的getAttribute()方法来获得application范围内的共享数据。PDF文件使用pdfFactory试用版本创建问题:“Servlet过滤器只能对Servlet进行过滤”,这句话是否正确?n答案:不正确。Servlet过滤器可以对Servlet、JSP和HTML文件过滤。PDF文件使用pdfFactory试用版本创建