`
- 浏览:
279726 次
- 性别:
- 来自:
上海
-
背景:
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.javaeye.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输出提高下载的速度
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
gzip压缩的工作原理基于LZ77算法,它通过查找文本中的重复模式并创建一个索引来实现压缩。在服务器端,gzip可以与HTTP响应头的"Content-Encoding"字段一起使用,告知浏览器接收到的数据是经过gzip压缩的。浏览器则会...
在WebLogic Server 8中,GZip压缩可以通过配置过滤器来实现。过滤器是Servlet规范的一部分,它可以在请求到达目标Servlet或JSP之前,以及在响应返回给客户端之后处理请求和响应。WebLogic提供了名为`...
在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等技术压缩HTTP响应,减小网络传输数据量。 8. 扩展性与维护 设计良好的模块化结构,使得系统容易扩展新功能,同时便于维护和升级。 综上所述,"JSP文件管理系统"是一个集成了文件操作、...
通过GZIP压缩减少网络传输大小。 五、部署与运行 1. 服务器环境:需要Java运行环境(JRE)和Java Web容器,如Tomcat或Jetty,来运行和部署JSP应用。 2. 配置与调试:根据具体服务器配置调整源码中的连接参数,例如...
有的浏览器支持 gzip 进行来对 HTML 文件进行压缩,可以减少数据传输的时间,从而提高页面响应速度。 秘籍五:使用缓存机制 缓存机制可以减少数据库查询的次数,提高页面响应速度。可以使用缓存框架,如 EhCache、...
4. **Filter**:过滤器用于在请求处理前后执行特定的操作,如登录验证、GZIP压缩等。 5. **Listener**:监听器可以监听Web应用中特定事件,如会话创建、销毁等,以便进行相应处理。 总之,“jsp+servlet模板”为Web...
6. **过滤器(Filter)**:允许在请求到达Servlet之前对其进行拦截和处理,如GZIP压缩、字符编码转换等。 7. **监听器(Listener)**:监听特定事件,如会话创建、销毁、上下文初始化等,可以进行相应的操作。 ### ...
过滤器可以用来实现如登录验证、GZIP压缩、字符编码转换、日志记录等多种功能。 **4. Maven** Maven是Java项目管理工具,它可以帮助开发者管理项目依赖、构建、文档生成等任务。项目中提到的“加上过滤器.do”,...
除了字符编码,过滤器还可以用于其他场景,比如登录检查、权限控制、GZIP压缩等。通过组合多个过滤器,我们可以构建出强大的中间件层,提高Web应用程序的灵活性和可维护性。 总的来说,`JSP`中的过滤器是一个强大的...
首先,GZIP压缩主要应用于HTML、CSS、JavaScript等静态文本文件,但也可以处理动态生成的页面,如CGI、PHP、JSP、ASP、Servlet和SHTML等。其压缩率通常在3到10倍之间,显著减少了网络流量,提升了用户体验。GZIP使用...
- 压缩传输:使用GZIP等压缩算法减少网络传输的数据量。 - 图片优化:如使用WebP等高效格式,或者在服务器端进行图片压缩,减少加载时间。 6. **用户体验** - 响应速度:通过上述优化手段,提高图片预览的加载...
使用GZIP压缩减少网络传输大小;使用CDN加速静态资源加载。 以上就是基于JSP开发个人博客系统的关键知识点。理解并掌握这些,你就能构建出功能完善的个人博客平台,同时也能为后续的Web开发打下坚实的基础。在实践...
- **压缩传输**:使用GZIP压缩,减小网络传输的数据量。 8. **安全考虑** - **输入验证**:防止SQL注入、XSS攻击,对用户输入的数据进行严格的检查和过滤。 - **安全连接**:使用HTTPS协议,保证数据传输的安全...
通常,HTML压缩可以通过多种方式实现,比如使用HTTP协议中的gzip压缩。gzip压缩是一种广泛应用的文件压缩方式,它可以显著减少传输数据的大小,但通常我们会发现服务器并不会对HTML文件启用gzip压缩,这主要是因为...