filter的做用 二

这注册了ClickstreamFilter并设置其处理*.jsp和*.html来的请求。这也将ClickstreamLogger注册为一个监听器以在应用事件发生时接受他们。
   两个JSP页面从会话中取clickstream数据和context对象并使用HTML界面来显示当前状态。下面的clickstream.jsp文件显示了个大概:
js 代码
  1. <%@ page import="java.util.*" %>   
  2. <%@ page import="Clickstream" %>   
  3. <%   
  4. Map clickstreams = (Map)application.getAttribute("clickstreams");   
  5. String showbots = "false";   
  6. if (request.getParameter("showbots") != null) {   
  7.   if (request.getParameter("showbots").equals("true"))   
  8.      showbots = "true";   
  9.   else if (request.getParameter("showbots").equals("both"))   
  10.      showbots = "both";   
  11. }   
  12. %>   
  13. <font face="Verdana" size="-1">   
  14. <h1>All Clickstreams</h1>   
  15. <a href="clickstreams.jsp?showbots=false">No Bots</a> |   
  16. <a href="clickstreams.jsp?showbots=true">All Bots</a> |   
  17. <a href="clickstreams.jsp?showbots=both">Both</a> <p>   
  18. <% if (clickstreams.keySet().size() == 0) { %>   
  19.          No clickstreams in progress   
  20. <% } %>   
  21. <%   
  22. Iterator it = clickstreams.keySet().iterator();   
  23. int count = 0;   
  24. while (it.hasNext()) {   
  25.    String key = (String)it.next();   
  26.    Clickstream stream = (Clickstream)clickstreams.get(key);   
  27.   if (showbots.equals("false") && stream.isBot()) {   
  28.     continue;   
  29.    }else if (showbots.equals("true") && !stream.isBot()) {   
  30.     continue;   
  31.    }   
  32.    count++;   
  33.   try {   
  34. %>   
  35.   
  36. <%= count %>.   
  37. <a href="viewstream.jsp?sid=<%= key %>"><b>   
  38. <%= (stream.getHostname() != null && !stream.getHostname().equals("") ?   
  39.       stream.getHostname() : "Stream") %>   
  40. </b></a> <font size="-1">[<%= stream.getStream().size() %> reqs]</font><br>   
  41.   
  42. <%   
  43.    }catch (Exception e) {   
  44. %>   
  45.    An error occurred - <%= e %><br>   
  46. <%   
  47.    }   
  48. }   
  49. %>  

WEB-INF/classes下,将JSP文件放到Web应用路径下,按帮助修改web.xml文件。为防止在这些工做前的争论,你能够从这个包很容易从OpenSymphony下载并安装。将Java文件编译并放在html

http://www.javaworld.com/jw-06-2001/Filters/clickstream.war处找到打好包的WAR文件,注意:要把jdk目录下的包rt.jar解压,并拷贝java包到classes下,否则会报没法编译的错误,而且还要修改jsp页面中对class的引用(改变一下class的目录,不要直接放在classes下)。
为能让此过滤器能在 Tomcat 4.0 beta 5下工做,我发现我不得不作一些轻微的改动。我作的改动显示了一些在servlet和过滤器的可移植性中一般容易犯的错误,因此我将他们列在下面:
·我不得不将在 JSP中添加一个额外的导入语句:。在Java中你并不须要导入在同一包下的类,而在服务器上JSP被编译到默认包中,你并不须要这句导入行。但在像Tomcat这样的服务器上,JSP被编译到一个自定义的包中,你不得不明确地从默认包中导入类。
·我不得不将 <listener></listener> 元素移动到web.xml文件中的<filter></filter>和<filter-mapping></filter-mapping>元素以后,就像部署描述DTD要求的那样。并非全部服务器对元素都要求固定的顺序。但Tomcat必需要。
·我不得不将 web.xml中的映射由/*.html和/*.jsp改为正确的*.html和*.jsp。一些服务器会忽略开头的/,但Tomcat强硬的规定开头不能有/。
·最后,我得将 ClickstreamFilter类升级到最新的生命周期API,将setFilterConfig()改为新的init()和destory()方法。
可下载的 WAR文件已经包含了这些修改并能经过服务器在包外运行,虽然我并无普遍的进行测试。
压缩响应

第三个过滤器是自动压缩响应输出流,以提升带宽利用率并提供一个很好的包装响应对象的示例。这个过滤器是由来自SUN的Amy Roh编写的,他为Tomcat 4.0 的“examples”Web程序作出过贡献。你将从webapps/examples/WEB-INF/classes/compressionFilters下找到原始代码。这里的例子代码以及WAR下的都已经为了更清晰和更简单而编辑过了。java

CompressionFilter类的策略是检查请求头以断定客户端是否支持压缩,若是支持,则将响应对象用自定义的响应来打包,它的getOutputStream()和getWriter()方法已经被定义为能够利用压缩过的输出流。使用过滤器容许如此简单而有效的解决问题。
咱们将从 init()开始看代码:
  1. public void init(FilterConfig filterConfig) {   
  2.     config = filterConfig;   
  3.     compressionThreshold = 0;   
  4.    if (filterConfig != null) {   
  5.       String str = filterConfig.getInitParameter("compressionThreshold");   
  6.      if (str != null) {   
  7.         compressionThreshold = Integer.parseInt(str);   
  8.       }   
  9.      else {   
  10.         compressionThreshold = 0;   
  11.       }   
  12.     }   
  13. }  
注意在检索请求头前必须把 request转化为HttpServletRequest,就想在第一个例子里那样。过滤器使用wrapper类CompressResponseWrapper,一个从
HttpServletResponseWrapper类继承下来的自定义类。这个wrapper的代码相对比较简单:
  1. public class CompressionResponseWrapper extends HttpServletResponseWrapper {   
  2.   
  3. protected ServletOutputStream stream = null;   
  4. protected PrintWriter writer = null;   
  5. protected int threshold = 0;   
  6. protected HttpServletResponse origResponse = null;   
  7.   
  8. public CompressionResponseWrapper(HttpServletResponse response) {   
  9.     super(response);   
  10.      origResponse = response;   
  11. }   
  12.   
  13. public void setCompressionThreshold(int threshold) {   
  14.     this.threshold = threshold;   
  15. }   
  16.   
  17. public ServletOutputStream createOutputStream() throws IOException {   
  18.     return (new CompressionResponseStream(origResponse));   
  19. }   
  20.   
  21. public ServletOutputStream getOutputStream() throws IOException {   
  22.     if (writer != null) {   
  23.       throw new IllegalStateException("getWriter() has already been " +   
  24.                                       "called for this response");   
  25.      }   
  26.   
  27.     if (stream == null) {   
  28.        stream = createOutputStream();   
  29.      }   
  30.      ((CompressionResponseStream) stream).setCommit(true);   
  31.      ((CompressionResponseStream) stream).setBuffer(threshold);   
  32.     return stream;   
  33. }   
  34.   
  35. public PrintWriter getWriter() throws IOException {   
  36.     if (writer != null) {   
  37.       return writer;   
  38.      }   
  39.   
  40.     if (stream != null) {   
  41.       throw new IllegalStateException("getOutputStream() has already " +   
  42.                                       "been called for this response");   
  43.      }   
  44.   
  45.      stream = createOutputStream();   
  46.      ((CompressionResponseStream) stream).setCommit(true);   
  47.      ((CompressionResponseStream) stream).setBuffer(threshold);   
  48.      writer = new PrintWriter(stream);   
  49.     return writer;   
  50. }   
  51. }   
全部调用 getOutputStream() 或者getWriter()都返回一个使用
CompressResponseStream类的对象。CompressionResponseStrteam类没有显示在这个例子中,由于它继承于ServletOutputStream并使用java.util.zip.GZIPOutputStream类来压缩流。
Tomcat的”examples”Web程序中已经预先配置了这个压缩过滤器并加载了一个示例servlet。示例servlet响应/CompressionTestURL(肯定先前的路径是/examples)。使用我制做的有用的 WAR文件,你能够用/servlet/compressionTest(再次提醒,别忘了适当的前导路径)访问此测试servlet。你可使用以下的web.xml片断来配置这个测试:
<filter></filter>
xml 代码
  1. <filter>  
  2.     <filter-name>compressionFilterfilter-name>  
  3.     <filter-class>CompressionFilterfilter-class>  
  4.     <init-param>  
  5.       <param-name>compressionThresholdparam-name>  
  6.       <param-value>10param-value>  
  7.     init-param>  
  8. filter>  
  9.   
  10. <filter-mapping>  
  11.     <filter-name>compressionFilterfilter-name>  
  12.     <servlet-name>compressionTestservlet-name>  
  13. filter-mapping>  
  14.   
  15. <servlet>  
  16.   <servlet-name>  
  17.      compressionTest   
  18.   servlet-name>  
  19.   <servlet-class>  
  20.      CompressionTestServlet   
  21.   servlet-class>  
  22. servlet>  
CompressionTestServlet(这里没有显示)输出压缩是否可用,若是可用,则输出压缩响应成功!
相关文章
相关标签/搜索