08-04
16
使用过滤器使您的 JSP 具有 HTTP 压缩功能
作者:Java伴侣 日期:2008-04-16
HTTP 压缩是指浏览器能够理解压缩过的 HTML 代码, 文本文档等, 从而减少网络传输流量的一种功能. 在目前的大部分主流浏览器上, 都支持这种功能, 例如 Ineternet Explorer, FireFox, Netscape, Opera 等, 对应的 HTTP 版本应该是 HTTP 1.1.
要探测浏览器是否支持 HTTP 压缩, 只要查看浏览器请求的头中是否有如下字样:
Accept-Encoding: gzip, deflate
即可, 这个即是说明浏览器支持 gzip 和 deflate(一种压缩格式)的压缩内容. 这就意味着: 可以向浏览器返回默认的未压缩的文本, 也可以用 GZIP 和 deflate 压缩过后传送给它, 浏览器会自己探测这些内容并解压缩, 这就以为着传输某些资料的时候(例如文本的 HTML 代码)可以大大减少网络需要传送的内容数.
那么, 如何实现这个功能呢? 其实 Apache Tomcat 5 安装时候所自带的示例目录下都做好了一个过滤器用来实现这个功能了:
{Tomcat5.0安装目录}\webapps\jsp-examples\WEB-INF\classes\compressionFilters
下就是这个过滤器的源码和类文件, 使用时候只要将这些文件放入类路径中, 然后向 web.xml 中加入过滤器配置语句就可以了:
不过有一个问题需要指出一下: 因为这个过滤器读取了 header 的内容, 因此会导致后继页面设置 request 的字符编码的时候失效, 因为根据 serlvet 源码中的注释这样说到:
/**
* Overrides the name of the character encoding used in the body of this
* request. This method must be called prior to reading request parameters
* or reading input using getReader().
*
*
* @param a <code>String</code> containing the name of
* the chararacter encoding.
* @throws java.io.UnsupportedEncodingException if this is not a valid encoding
*/
public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;
这样一来, 如果您的中文解决方案依赖了这个做法, 必须考虑另外加入过滤器在这个过滤器被调用之前设置合适的字符编码, 同样的, 您可以考虑这个例子下的 filters.SetCharacterEncodingFilter 过滤器来完成这个工作, 我个人的做法是所有的页面表单参数统一都用 UTF-8 来传送, 这也是 W3C 建议的国际化网页的标准做法.
那么, 最后的效果很明显的可以看到. 你做一个简单的 JSP 页面, 向里面放入很多字符串, 那么你可以用浏览器的右键功能看到这个页面的大小会远远小于查看源代码所得到的文字的总大小, 原因就是这个页面被压缩传输了.
不过, 也有一个弊端, 就是压缩传输会增大服务器的负荷, 而且理论上应该只压缩那些必要的文本内容, 而已经压缩过的图片, 视频等资源就没有必要再次进行压缩了, 那样只会造成不必要的 CPU 浪费.
需要注意的是 HTTP 压缩看上去只有 HTTP 1.1 才支持, 您需要在 Internet Explorer 中启用这个功能. 方法如下:
在 Internete 选项中选择高级选项卡, 然后在第一行中选择启用 HTTP 1.1, 然后重启 IE 即可.如果 IE 用的是 HTTP 1.0, 则没有这个功能.
最后列出使用了完整过滤器解决方案的 web.xml:
参考文章:
如何使用HTTP压缩优化服务器 http://www.cnblogs.com/shanyou/archive/2005/08/23/221259.aspx
要探测浏览器是否支持 HTTP 压缩, 只要查看浏览器请求的头中是否有如下字样:
Accept-Encoding: gzip, deflate
即可, 这个即是说明浏览器支持 gzip 和 deflate(一种压缩格式)的压缩内容. 这就意味着: 可以向浏览器返回默认的未压缩的文本, 也可以用 GZIP 和 deflate 压缩过后传送给它, 浏览器会自己探测这些内容并解压缩, 这就以为着传输某些资料的时候(例如文本的 HTML 代码)可以大大减少网络需要传送的内容数.
那么, 如何实现这个功能呢? 其实 Apache Tomcat 5 安装时候所自带的示例目录下都做好了一个过滤器用来实现这个功能了:
{Tomcat5.0安装目录}\webapps\jsp-examples\WEB-INF\classes\compressionFilters
下就是这个过滤器的源码和类文件, 使用时候只要将这些文件放入类路径中, 然后向 web.xml 中加入过滤器配置语句就可以了:
复制内容到剪贴板 程序代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Output the content with gzip compression if possible -->
<filter>
<filter-name>Compression Filter</filter-name>
<filter-class>compressionFilters.CompressionFilter</filter-class>
<init-param>
<param-name>compressionThreshold</param-name>
<param-value>512</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Compression Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Output the content with gzip compression if possible -->
<filter>
<filter-name>Compression Filter</filter-name>
<filter-class>compressionFilters.CompressionFilter</filter-class>
<init-param>
<param-name>compressionThreshold</param-name>
<param-value>512</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Compression Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
不过有一个问题需要指出一下: 因为这个过滤器读取了 header 的内容, 因此会导致后继页面设置 request 的字符编码的时候失效, 因为根据 serlvet 源码中的注释这样说到:
/**
* Overrides the name of the character encoding used in the body of this
* request. This method must be called prior to reading request parameters
* or reading input using getReader().
*
*
* @param a <code>String</code> containing the name of
* the chararacter encoding.
* @throws java.io.UnsupportedEncodingException if this is not a valid encoding
*/
public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;
这样一来, 如果您的中文解决方案依赖了这个做法, 必须考虑另外加入过滤器在这个过滤器被调用之前设置合适的字符编码, 同样的, 您可以考虑这个例子下的 filters.SetCharacterEncodingFilter 过滤器来完成这个工作, 我个人的做法是所有的页面表单参数统一都用 UTF-8 来传送, 这也是 W3C 建议的国际化网页的标准做法.
那么, 最后的效果很明显的可以看到. 你做一个简单的 JSP 页面, 向里面放入很多字符串, 那么你可以用浏览器的右键功能看到这个页面的大小会远远小于查看源代码所得到的文字的总大小, 原因就是这个页面被压缩传输了.
不过, 也有一个弊端, 就是压缩传输会增大服务器的负荷, 而且理论上应该只压缩那些必要的文本内容, 而已经压缩过的图片, 视频等资源就没有必要再次进行压缩了, 那样只会造成不必要的 CPU 浪费.
需要注意的是 HTTP 压缩看上去只有 HTTP 1.1 才支持, 您需要在 Internet Explorer 中启用这个功能. 方法如下:
在 Internete 选项中选择高级选项卡, 然后在第一行中选择启用 HTTP 1.1, 然后重启 IE 即可.如果 IE 用的是 HTTP 1.0, 则没有这个功能.
最后列出使用了完整过滤器解决方案的 web.xml:
复制内容到剪贴板 程序代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Example filter to set character encoding on each request -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- Output the content with gzip compression if possible -->
<filter>
<filter-name>Compression Filter</filter-name>
<filter-class>compressionFilters.CompressionFilter</filter-class>
<init-param>
<param-name>compressionThreshold</param-name>
<param-value>512</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<!-- Must before the Compressioin Filter -->
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Compression Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Example filter to set character encoding on each request -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- Output the content with gzip compression if possible -->
<filter>
<filter-name>Compression Filter</filter-name>
<filter-class>compressionFilters.CompressionFilter</filter-class>
<init-param>
<param-name>compressionThreshold</param-name>
<param-value>512</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<!-- Must before the Compressioin Filter -->
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Compression Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
参考文章:
如何使用HTTP压缩优化服务器 http://www.cnblogs.com/shanyou/archive/2005/08/23/221259.aspx
评论: 0 | 引用: 0 | 查看次数: 600
发表评论