您好,欢迎访问三七文档
北京圣思园科技有限公司•教学目标–了解Servlet过滤器的概念–了解Servlet过滤器的工作过程–掌握创建Servlet过滤器的方法–掌握发布Servlet过滤器的方法•Servlet过滤器是在JavaServlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。•Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。•Servlet过滤器能够在Servlet被调用之前检查Request对象,修改RequestHeader和Request内容;•在Servlet被调用之后检查Response对象,修改ResponseHeader和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。•所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:–init()–doFilter()–destroy()•init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数•doFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器•destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源•下面创建一个NoteFilter过滤器,它可以拒绝列在黑名单上的客户访问留言簿,•参考NoteFilter.java•当NoteFilter初始化时,它调用config.getInitParameter(blacklist)方法,从web.xml文件中读取初始化参数blacklist,这个参数表示被禁止访问留言簿的客户黑名单。publicvoidinit(FilterConfigconfig)throwsServletException{this.config=config;blackList=config.getInitParameter(blacklist);}•在NoteFilter的doFilter()方法中首先从request对象中读取客户姓名,然后将客户姓名转换为中文字符编码。如果客户姓名中包含黑名单里的字符串,那么将直接向客户端返回一个拒绝网页。由于在这种情况下没有调用chain.doFilter()方法,因此客户请求不会到达所访问的Web组件。//获得username请求参数,进行字符编码转换Stringusername=((HttpServletRequest)request).getParameter(username);if(username!=null)username=newString(username.getBytes(ISO-8859-1),GB2312);//进行身份验证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;}•假定姓名中包含“捣蛋鬼”字符串的客户将被禁止访问留言簿,并且留言簿由NoteServlet类来实现,当名叫“捣蛋鬼2000”的客户访问留言簿时,将被NoteFilter过滤器拒绝访问。当名叫“捣蛋鬼2000”的客户访问留言簿时NoteFilter的工作流程•如果客户名不在黑名单里,NoteFilter的doFilter方法就会调用chain.doFilter()方法,这个方法用于调用过滤器链中后续过滤器的doFilter()方法。•假如没有后续过滤器,那么就把客户请求传给相应的Web组件。•在本例中,在调用chain.doFilter()方法前后记录了调用的时间,从而计算出Web组件响应客户请求所花的时间。longbefore=System.currentTimeMillis();chain.doFilter(request,response);longafter=System.currentTimeMillis();Stringname=;if(requestinstanceofHttpServletRequest){name=((HttpServletRequest)request).getRequestURI();}Longtime=after–before;System.out.println(“所用时间:”+time+“ms”);当名叫“小精灵”的客户访问留言簿时NoteFilter的工作流程•发布Servlet过滤器时,必须在web.xml文件中加入filter元素和filter-mapping元素。filter元素用来定义一个过滤器:filterfilter-nameNoteFilter/filter-namefilter-classNoteFilter/filter-classinit-paramparam-nameblacklist/param-nameparam-value捣蛋鬼/param-value/init-param/filter•filter-mapping元素用于将过滤器和URL关联:filter-mappingfilter-nameNoteFilter/filter-nameurl-pattern/note/url-pattern/filter-mapping提示:在web.xml文件中,必须先配置Servlet过滤器,再配置Servlet•创建一个Servlet类NoteServlet,它实现一个简单的留言簿。它提供了一个表单,让客户输入姓名和留言,客户提交表单后,再将用户输入的信息显示在客户端的网页上。•访问NoteServlet:filterfilter-nameFilter1/filter-namefilter-classFilter1/filter-class/filterfilterfilter-nameFilter2/filter-namefilter-classFilter2/filter-class/filterfilter-mappingfilter-nameFilter1/filter-nameurl-pattern/note/url-pattern/filter-mappingfilter-mappingfilter-nameFilter2/filter-nameurl-pattern/note/url-pattern/filter-mapping•问题:在Servlet过滤器中能否访问application范围内的共享数据?•答案:可以的,先调用FilterConfig的getServletContext()方法获得ServletContext,再调用ServletContext的getAttribute()方法来获得application范围内的共享数据。•问题:“Servlet过滤器只能对Servlet进行过滤”,这句话是否正确?•答案:不正确。Servlet过滤器可以对Servlet、JSP和HTML文件过滤。
本文标题:Filter
链接地址:https://www.777doc.com/doc-6176743 .html