第三章Java基础加强-Servlet过滤器JavaWeb第1页/共38页Filter典型应用Filter(过滤器)简介Filter(过滤器)接口本章目标点重第2页/共38页点重Filter简介Filter(过滤器)简介Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能。在ServletAPI中定义了三个接口类来开供开发人员编写Filter程序:Filter,FilterChain,FilterConfigFilter程序是一个实现了Filter接口的Java类,与Servlet程序相似,它由Servlet容器进行调用和执行Filter程序需要在web.xml文件中进行注册和设置它所能拦截的资源:Filter程序可以拦截Jsp,Servlet,静态图片文件和静态html文件第3页/共38页Filter执行过程第4页/共38页Filter的基本工作原理编译时当在web.xml中注册了一个Filter来对某个Servlet程序进行拦截处理时,这个Filter就成了Servlet容器与该Servlet程序的通信线路上的一道关卡,该Filter可以对Servlet容器发送给Servlet程序的请求和Servlet程序回送给Servlet容器的相应进行拦截,可以决定是否将请求继续传递给Servlet程序,以及对请求和相应信息是否进行修改在一个web应用程序中可以注册多个Filter程序,每个Filter程序都可以对一个或一组Servlet程序进行拦截。的若有多个Filter程序对某个Servlet程序的访问过程进行拦截,当针对该Servlet的访问请求到达时,web容器将把这多个Filter程序组合成一个Filter链(过滤器链)。Filter链中各个Filter的拦截顺序与它们在应用程序的web.xml中映射的顺序一致第5页/共38页Filter接口第6页/共38页接口名说明init(FilterConfigfilterConfig)throwsServletException初始化方法。destroy()销毁时调用的方法doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)过滤执行方法过滤器部署filterdisplay-nameLoginFilter/display-namefilter-nameLoginFilter/filter-namefilter-classcom.osekj.oa.web.filter.LoginFilter/filter-class/filterfilter-mappingfilter-nameLoginFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping第7页/共38页Filter子元素第8页/共38页dispatcher子元素可以设置的值及其意义:REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。典型应用1浏览器不缓存页面的过滤器有3个HTTP响应头字段都可以禁止浏览器缓存当前页面,它们在Servlet中的示例代码如下•response.setDateHeader(Expires,-1);•response.setHeader(Cache-Control,no-cache);•response.setHeader(Pragma,no-cache);并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头第9页/共38页典型应用2-字符过滤器第10页/共38页filter!--过滤器名称--filter-nameCharactorFilter/filter-name!--过滤器的完整类名--filter-classcom.osekj.oa.util.CharactorFilter/filter-class!--初始化参数--init-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param/filterfilter-mappingfilter-nameCharactorFilter/filter-nameurl-pattern/*/url-pattern/filter-mappingpublicclassCharactorFilterimplementsFilter{Stringencoding=null;publicvoiddestroy(){encoding=null;}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{if(encoding!=null){request.setCharacterEncoding(encoding);response.setContentType(text/html;charset=+encoding);}chain.doFilter(request,response);}publicvoidinit(FilterConfigfilterConfig)throwsServletException{encoding=filterConfig.getInitParameter(encoding);}}典型应用3-权限验证第11页/共38页典型应用4-伪静态1.下载urlrewrite-3.2.0.jar2.配置web.xml过滤3.jar包中有个conf-dist.xml文件,复制出来改名为urlrewrite.xml放在WEB-INF目录下第12页/共38页filterfilter-nameUrlRewriteFilter/filter-namefilter-classorg.tuckey.web.filters.urlrewrite.UrlRewriteFilter/filter-classinit-paramparam-namelogLevel/param-nameparam-valueWARN/param-value/init-param/filterfilter-mappingfilter-nameUrlRewriteFilter/filter-nameurl-pattern/*/url-patterndispatcherREQUEST/dispatcherdispatcherFORWARD/dispatcher/filter-mapping?xmlversion=1.0encoding=utf-8?!DOCTYPEurlrewritePUBLIC-//tuckey.org//DTDUrlRewrite3.2//EN=regexnotefrom:{method}-{id}.htmlto:=331/notefrom^/(\w*)-(\d*)-(\d*)\.html$/fromtotype=redirect%{context-path}/$1.jsp?id=$2&subid=$3/to/rule/urlrewrite第13页/共38页