- 浏览: 318378 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
完善自我:
支持一下!
揭秘IT人才特点:中美印日四国程序员比较 -
悲剧了:
好文,看玩thinking in java的提到的异常处理,看 ...
高效的Java异常处理框架(转) -
yin_bp:
开源框架bbossgroups页支持组件异步方法调用哦,详情请 ...
Spring 3中异步方法调用 -
flyjava:
sun的悲哀
Apache怒了,威胁说要离开JCP
HTTP
压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对
于普通的浏览过程HTML ,CSS,Javascript , Text
,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP ,
Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。
目前实现gzip压缩有2种办法:
方法一、是有的容器(服务器)提供的功能,但这个局限于特定容器。比如
apache+tomcat
或者
resin-pro
版
。
方法二、是 部署前手动
gzip
压缩,配合
servlet
过滤器使用,这个能实现
gzip
功能,但是降低了灵活性。
方案一
1、TOMCAT配置GZIP压缩:
tomcat5.5.x配置
修改%TOMCAT_HOME%\conf \server.xml启用支持gzip压缩.
添加下列属性
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
TOMCAT配置说明
1) compression="on" 打开压缩功能
2) compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩
4) compressableMimeType="text/html,text/xml" 压缩类型
Resin容器中配置GZIP压缩方法
http://localhost:8080/MyProj/pdf/0.jpg 可以打开一张图片。用Httpwatch查看
Accept-Encoding: gzip, deflate
Sent : 315
Received 43106
开始配置Resin
我按照这样的配置:
<web-app id="/" root-directory="webapps/MyProj">
<filter filter-name="gzip" filter-class="com.caucho.filters.GzipFilter">
<init>
<use-vary>true</use-vary>
</init>
</filter>
<filter-mapping filter-name="gzip">
<url-pattern>
<exclude-pattern>*.jpg</exclude-pattern>
<include-pattern>/*</include-pattern>
</url-pattern>
</filter-mapping>
</web-app>
再测试发现不起作用!不清楚如何配置哦!
我再看了一下资料上面有讲说 需要resin的专业版即resin-pro
现在再看下我的resin :Resin-3.2.1 (built Fri, 17 Oct 2008 04:11:01 PDT)
果然是我的版本不一致导致的。重新从网上下载一下专业版的RESIN下来再试!
以下是我再测试的过程:
测试发现还是不行呀!我昏~~~ 不过感觉专业版与普通版在配置上面还是有点差别的
待续未完!
方案二:
设置Content-Encoding
Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档 的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept- Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
压缩流
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
OutputStream out = null;
String encoding = request.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") != -1){
request.setHeader("Content-Encoding" , "gzip");
out = new GZIPOutputStream(request.getOutputStream());
}
else if (encoding != null && encoding.indexOf("comdivss") != -1){
request.setHeader("Content-Encoding" , "comdivss");
out = new ZIPOutputStream(request.getOutputStream());
}else{
out = request.getOutputStream();
实例:
采用gzip servlet filter实现
从 HTTP/1.1 开始,客户端就可以在请求头中添加
Accept-Encoding: gzip,deflate (可以从HTTP WATCH中查看发现确实支持)
来向请求的服务器表明自己支持 Gzip 压缩的响应。Web 服务器则在响应头中添加
Content-Encoding: gzip
来向客户端表明响应体是经过 gzip 压缩的。
程序代码如下:
(在此非常感谢 http://tdcq.iteye.com/blog/453644 提供代码)
具体代码如下:
package sh.blog.util.web.filter;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletOutputStream;
public class CompressedStream extends ServletOutputStream {
private ServletOutputStream out;
private GZIPOutputStream gzip;
/**
* 指定压缩缓冲流
* @param 输出流到压缩
* @throws IOException if an error occurs with the {@link GZIPOutputStream}.
*/
public CompressedStream(ServletOutputStream out) throws IOException {
this.out = out;
reset();
}
/** @see ServletOutputStream * */
public void close() throws IOException {
gzip.close();
}
/** @see ServletOutputStream * */
public void flush() throws IOException {
gzip.flush();
}
/** @see ServletOutputStream * */
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
/** @see ServletOutputStream * */
public void write(byte[] b, int off, int len) throws IOException {
gzip.write(b, off, len);
}
/** @see ServletOutputStream * */
public void write(int b) throws IOException {
gzip.write(b);
}
public void reset() throws IOException {
gzip = new GZIPOutputStream(out);
}
}
package sh.blog.util.web.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class CompressionResponse extends HttpServletResponseWrapper{
protected HttpServletResponse response;
private ServletOutputStream out;
private CompressedStream compressedOut;
private PrintWriter writer;
protected int contentLength;
public CompressionResponse(HttpServletResponse response) throws IOException {
super(response);
this.response = response;
compressedOut = new CompressedStream(response.getOutputStream());
}
public void setContentLength(int len) {
contentLength = len;
}
public ServletOutputStream getOutputStream() throws IOException {
if (null == out) {
if (null != writer) {
throw new IllegalStateException("getWriter() has already been called on this response.");
}
out = compressedOut;
}
return out;
}
public PrintWriter getWriter() throws IOException {
if (null == writer) {
if (null != out) {
throw new IllegalStateException("getOutputStream() has already been called on this response.");
}
writer = new PrintWriter(compressedOut);
}
return writer;
}
public void flushBuffer() {
try {
if (writer != null) {
writer.flush();
}else if (out != null) {
out.flush();
}
}catch (IOException e) {
e.printStackTrace();
}
}
public void reset() {
super.reset();
try {
compressedOut.reset();
}catch (IOException e) {
throw new RuntimeException(e);
}
}
public void resetBuffer() {
super.resetBuffer();
try {
compressedOut.reset();
}catch (IOException e) {
throw new RuntimeException(e);
}
}
public void close() throws IOException {
compressedOut.close();
}
}
package sh.blog.util.web.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CompressionFilter implements Filter {
protected Log log = LogFactory.getFactory().getInstance(this.getClass().getName());
@SuppressWarnings("unchecked")
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
boolean compress = false;
if (request instanceof HttpServletRequest){
HttpServletRequest httpRequest = (HttpServletRequest) request;
Enumeration headers = httpRequest.getHeaders("Accept-Encoding");
while (headers.hasMoreElements()){
String value = (String) headers.nextElement();
if (value.indexOf("gzip") != -1){
compress = true;
}
}
}
if (compress){//如果浏览器支持则压缩
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.addHeader("Content-Encoding", "gzip");
CompressionResponse compressionResponse= new CompressionResponse(httpResponse);
chain.doFilter(request, compressionResponse);
compressionResponse.close();
}
else{//如果浏览器不支持则不压缩
chain.doFilter(request, response);
}
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy(){
}
}
一共有三个CLASS文件!实现GZIP压缩输出响应
2.1 对图片输出做压缩处理测试
建立目录pdf里面存储图片
第一步:不配置过滤器用HTTP WATCHE发现
image/jpeg : 42891 bytes, 670 x 446 pixels
第二步:配置Web.xml配置过滤器
<filter>
<filter-name>gzip</filter-name>
<filter-class>sh.blog.util.web.filter.CompressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzip</filter-name>
<url-pattern>/pdf/*</url-pattern>
</filter-mapping>
再用HTTP WATCH查看发现
image/jpeg : 42891 bytes, gzip compressed to 42712 bytes ( 0.417 % saving ), 670 x 446 pixels
实现了一次压缩处理输出!
PS:我再用png格式的图片做过一次测试发现一次可以实现GZIP压缩输出
结论:通过上面的过滤器能够实现对图片的压缩处理,提高响应速度!
2.2 对音乐的压缩处理以MP3的输出 为测试对象
建立目录music里面存储音乐
第一步:不配置过滤器发现
audio/mpeg : 9001 bytes of binary data
第二步:配置过滤器
<filter>
<filter-name>gzip</filter-name>
<filter-class>sh.blog.util.web.filter.CompressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzip</filter-name>
<url-pattern>/music/*</url-pattern>
</filter-mapping>
再次查看发现:
audio/mpeg : , gzip compressed to 0 bytes ( 0 % saving )
结论:上面的算法对音乐文件不起压缩作用。感觉这种GZIP的算法应该是不同的格式算法不一样
2.3 对JS文件压缩输出
第一步:不做压缩
4864
第二步:配置压缩
<filter>
<filter-name>gzip</filter-name>
<filter-class>sh.blog.util.web.filter.CompressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzip</filter-name>
<url-pattern>/scripts/*.js</url-pattern>
</filter-mapping>
输出:
application/x-javascript : 4636 bytes, gzip compressed to 69 bytes ( 98.5 % saving )
查看发现JS的压缩是相当高的了!
结论:将JS存入指定的目录然后直接对此目录做GZIP压缩输出。可以看到效果是显著的!
通过做GZIP压缩输出之后可以减少网络带宽流量从而加快下载速度!
2.4 对CSS文件压缩输出
第一步:没有压缩输出
text/css : 413 bytes
第二步:压缩
配置:
<filter>
<filter-name>gzip</filter-name>
<filter-class>sh.blog.util.web.filter.CompressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzip</filter-name>
<url-pattern>/scripts/*.js</url-pattern>
<url-pattern>/style/*.css</url-pattern>
</filter-mapping>
结果:
text/css : 413 bytes, gzip compressed to 101 bytes ( 75.5 % saving )
结论:对CSS的压缩效果也是非常明显的哦!
2.5 对HTML页面压缩输出
第一步:不压缩
text/html : 2272 bytes
第二步;压缩
<filter>
<filter-name>gzip</filter-name>
<filter-class>sh.blog.util.web.filter.CompressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzip</filter-name>
<url-pattern>/scripts/*.js</url-pattern>
<url-pattern>/style/*.css</url-pattern>
<url-pattern>*.html</url-pattern>
</filter-mapping>
结果:
text/html : 2272 bytes, gzip compressed to 240 bytes ( 89.4 % saving )
结论:对HTML的压缩效果也是非常明显的哦!
2.6 对JSP页面的压缩
第一步:未做压缩
text/html; charset=iso-8859-1 : 1008 bytes
第二步:压缩输出
<filter>
<filter-name>gzip</filter-name>
<filter-class>sh.blog.util.web.filter.CompressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzip</filter-name>
<url-pattern>/scripts/*.js</url-pattern>
<url-pattern>/style/*.css</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
结果:页面 无输出!
结论:
以上的算法可以应用于 图片、HTML、CSS、JS的GZIP压缩输出。对于JSP页面无效!
应用:
将来可以在站点中编写此类过滤器,将页面内容尽可能地做GZIP输出提高下载的速度
转自:http://hi.baidu.com/andyloolu/blog/item/b8c80f03be5bfe0b1d9583d1.html
发表评论
-
Web编程是函数式编程
2010-11-30 13:44 1074任何一位在两个领域里 ... -
如何开发Web应用程序
2010-11-30 13:41 1142这是一个经常被问到的 ... -
设计Web应用程序时要注意可伸缩性
2010-11-26 09:19 954Max Indelicato是一位软件 ... -
Web 2.0应用客户端性能问题十大根源
2010-11-25 20:19 1047Web 2.0应用的推广为用户带来了全新的体验,同时也让开 ... -
浏览器加载和渲染html的顺序
2010-11-22 09:45 25951.浏览器加载和渲染html的顺序 1、IE下载的顺序是从上到 ... -
在服务端合并和压缩JavaScript和CSS文件
2010-11-22 09:16 1163Web性能优化最佳实践中最重要的一条是减少HTTP请求 ... -
用 YUI Compressor 压缩和混淆 JS 和 CSS
2010-11-22 09:05 2401一、简介: 目前开发Web应用Javas ... -
如何缓存DWR生成的JS文件
2010-11-18 17:37 1977DWR provides a convenient mec ... -
HTTP状态一览
2010-11-17 22:43 781在网站建设的实际应用中,容易出现很多小小的失误,就像m ... -
两款HTTP流量分析工具的比较:HTTP Watch,Fiddler
2010-11-17 17:26 0做Web开发或者Web分析经常需要查看Http通讯的过程, ... -
了解CSS的查找匹配原理,让CSS更简洁、高效
2010-11-17 16:49 0用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知 ... -
高性能WEB开发 - flush让页面分块,逐步呈现
2010-11-17 16:47 0在处理比较耗时的请求的时候,我们总希望先让用户先 ... -
WEB高性能开发 - 疯狂的HTML压缩
2010-11-17 16:46 0前言: ... -
该如何加载google-analytics(或其他第三方)的JS
2010-11-17 16:44 0很多网站为了获取用户访问网站的统计信息,使用了go ... -
高性能WEB开发 - 页面呈现、重绘、回流。
2010-11-17 15:57 0页面呈现流程 在讨论页面重绘、回流之前。需要 ... -
高性能WEB开发 - JS、CSS的合并、压缩、缓存管理
2010-11-17 15:54 0本篇文章主要讨论下目前JS,CSS 合并、压缩、缓存 ... -
高性能WEB开发- 减少请求,响应的数据量
2010-11-17 15:49 0上一篇中我们说 ... -
高性能WEB开发 - 为什么要减少请求数,如何减少请求数!
2010-11-17 15:42 0http请求头的数据量 我们先分析下 ... -
高性能web开发 - 如何加载JS,JS应该放在什么位置?
2010-11-17 15:39 0外部JS的阻塞下载 所有浏览器在下载JS的时候, ... -
Web缓存教程
2010-11-17 15:08 1461原文(英文)地址: http://www.mnot.n ...
相关推荐
gzip压缩的工作原理基于LZ77算法,它通过查找文本中的重复模式并创建一个索引来实现压缩。在服务器端,gzip可以与HTTP响应头的"Content-Encoding"字段一起使用,告知浏览器接收到的数据是经过gzip压缩的。浏览器则会...
WebLogic的GZip压缩是一种优化技术,用于减少通过网络传输的数据量,...此外,对于现代Web应用,你还需要考虑是否需要在API请求、WebSocket通信或其他非HTML内容上启用GZip压缩,因为这可能会引入额外的复杂性和开销。
在IT行业中,优化Web服务性能是一项重要的任务,其中一种常用的方法是通过开启服务器的数据压缩功能,比如在Tomcat中使用gzip来压缩数据。gzip是一种广泛使用的数据压缩算法,尤其适用于HTTP传输,它能够显著减少...
3. **与服务器配置配合**:一些服务器如Apache和Nginx有内置的GZIP压缩功能,可以结合使用,实现双重压缩。 4. **动态内容**:对于动态生成的HTML(如PHP、JSP、ASP),可能需要在服务器端进行压缩,而不是仅依赖于...
### 开启TOMCAT6的GZIP压缩 #### 背景与意义 随着互联网的发展,用户对于网页加载速度的要求越来越高。为了提升用户体验并减轻网络带宽的压力,TOMCAT服务器可以通过启用GZIP压缩功能来优化数据传输。GZIP是一种...
本文将重点探讨如何在Microsoft IIS服务器环境下实现GZip压缩,以此提高网页加载速度。 #### 二、GZip压缩简介 **GZip**是一种广泛使用的数据压缩格式及软件工具,它能够有效减小文件或数据流的体积。在网络传输中...
在IT行业中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,它是Java技术的一部分,允许开发者将HTML、XML或其他标记语言与Java代码混合在一起,从而实现服务器端的逻辑处理。"jsp实现下载"这个主题涉及到...
4. **将显式数据(即文档)发送回客户端**:响应可以以多种格式发送,包括文本(HTML或XML)、二进制(如GIF图像)或gzip等压缩格式。HTML是最常见的格式,因此Servlet经常需要将处理后的结果转化为HTML文档。 **...
通过GZIP压缩减少网络传输大小。 五、部署与运行 1. 服务器环境:需要Java运行环境(JRE)和Java Web容器,如Tomcat或Jetty,来运行和部署JSP应用。 2. 配置与调试:根据具体服务器配置调整源码中的连接参数,例如...
- 文件压缩:通过GZIP等技术压缩HTTP响应,减小网络传输数据量。 8. 扩展性与维护 设计良好的模块化结构,使得系统容易扩展新功能,同时便于维护和升级。 综上所述,"JSP文件管理系统"是一个集成了文件操作、...
有的浏览器支持 gzip 进行来对 HTML 文件进行压缩,可以减少数据传输的时间,从而提高页面响应速度。 秘籍五:使用缓存机制 缓存机制可以减少数据库查询的次数,提高页面响应速度。可以使用缓存框架,如 EhCache、...
4. **Filter**:过滤器用于在请求处理前后执行特定的操作,如登录验证、GZIP压缩等。 5. **Listener**:监听器可以监听Web应用中特定事件,如会话创建、销毁等,以便进行相应处理。 总之,“jsp+servlet模板”为Web...
6. **过滤器(Filter)**:允许在请求到达Servlet之前对其进行拦截和处理,如GZIP压缩、字符编码转换等。 7. **监听器(Listener)**:监听特定事件,如会话创建、销毁、上下文初始化等,可以进行相应的操作。 ### ...
首先,GZIP压缩主要应用于HTML、CSS、JavaScript等静态文本文件,但也可以处理动态生成的页面,如CGI、PHP、JSP、ASP、Servlet和SHTML等。其压缩率通常在3到10倍之间,显著减少了网络流量,提升了用户体验。GZIP使用...
- **压缩传输**:使用GZIP压缩,减小网络传输的数据量。 8. **安全考虑** - **输入验证**:防止SQL注入、XSS攻击,对用户输入的数据进行严格的检查和过滤。 - **安全连接**:使用HTTPS协议,保证数据传输的安全...
通常,HTML压缩可以通过多种方式实现,比如使用HTTP协议中的gzip压缩。gzip压缩是一种广泛应用的文件压缩方式,它可以显著减少传输数据的大小,但通常我们会发现服务器并不会对HTML文件启用gzip压缩,这主要是因为...
对于动态生成的内容,如CGI、PHP、JSP、ASP、Servlet等,gzip压缩同样适用,能显著提高响应效率。 启用Tomcat的gzip压缩,需要修改`%TOMCAT_HOME%/conf/server.xml`配置文件中的`<Connector>`节点。具体步骤如下: ...
除了字符编码,过滤器还可以用于其他场景,比如登录检查、权限控制、GZIP压缩等。通过组合多个过滤器,我们可以构建出强大的中间件层,提高Web应用程序的灵活性和可维护性。 总的来说,`JSP`中的过滤器是一个强大的...
过滤器可以用来实现如登录验证、GZIP压缩、字符编码转换、日志记录等多种功能。 **4. Maven** Maven是Java项目管理工具,它可以帮助开发者管理项目依赖、构建、文档生成等任务。项目中提到的“加上过滤器.do”,...
开启gzip压缩可以在server.xml文件中通过添加或修改Connector配置来实现。Gzip是一种广泛使用的数据压缩算法,它可以在HTTP传输过程中压缩数据,从而减少传输数据的大小,加快页面加载速度,节省带宽资源。在Tomcat...