`
tanyiliang
  • 浏览: 5485 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用JAVA实现JS/CSS的gzip压缩功能

    博客分类:
  • WEB
阅读更多

 

 <filter>
		<filter-name>ZGIPFilter</filter-name>
		<filter-class>com.ztesoft.zsmart.web.filter.ZGIPFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ZGIPFilter</filter-name>
		<url-pattern>*.js</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>ZGIPFilter</filter-name>
		<url-pattern>*.css</url-pattern>
	</filter-mapping>

 

 

public class ZGIPFilter extends HttpServlet implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
        // 判断是否包含了 Accept-Encoding 请求头部
        HttpServletRequest s = (HttpServletRequest) request;
        String header = s.getHeader("Accept-Encoding");
        if (header != null && header.toLowerCase().contains("gzip")) {
            HttpServletResponse resp = (HttpServletResponse) response;
            final ByteArrayOutputStream buffer = new ByteArrayOutputStream();

            HttpServletResponseWrapper hsrw = new HttpServletResponseWrapper(resp) {
                @Override
                public PrintWriter getWriter() throws IOException {
                    return new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding()));
                }

                @Override
                public ServletOutputStream getOutputStream() throws IOException {
                    return new ServletOutputStream() {
                        @Override
                        public void write(int b) throws IOException {
                            buffer.write(b);
                        }
                    };
                }
            };

            chain.doFilter(request, hsrw);
            byte[] gzipData = gzip(buffer.toByteArray());
            resp.addHeader("Content-Encoding", "gzip");
            resp.setContentLength(gzipData.length);
            ServletOutputStream output = response.getOutputStream();
            output.write(gzipData);
            output.flush();
        }
        else {
            chain.doFilter(request, response);
        }
    }

    // 用 GZIP 压缩字节数组
    private byte[] gzip(byte[] data) {
        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240);
        GZIPOutputStream output = null;
        try {
            output = new GZIPOutputStream(byteOutput);
            output.write(data);
        }
        catch (IOException e) {
        }
        finally {
            try {
                output.close();
            }
            catch (IOException e) {
            }
        }
        return byteOutput.toByteArray();
    }
}

 

 GZIP前


  GZIP后


 结论:如果服务器端未采用gzip格式压缩,可以通过这样的配置实现。由上图看出来,文件压缩之后大小由原来的94890变成33673,将近减小了三分之二,还是可观的。这里只配置了JS和CSS的压缩,HTML静态页面应可以使用,图片使用GZIP压缩会有点问题(以png为例,大小由原来的480605变成了480736,反而变大了)。

  • 大小: 130.6 KB
  • 大小: 120.6 KB
分享到:
评论
2 楼 tanyiliang 2013-09-18  
gshine 写道
图片使用GZIP压缩会有点问题(以png为例,大小由原来的480605变成了480736,反而变大了)。

这是为什么呢?

原因很简单:在web里面用作背景的图片99%以上都是gif或者jpg或者png,这些格式本来就是压缩过的,再用gzip对他们进行压缩只是徒增服务器负担而已。
1 楼 gshine 2013-09-17  
图片使用GZIP压缩会有点问题(以png为例,大小由原来的480605变成了480736,反而变大了)。

这是为什么呢?

相关推荐

    java开启JBoss的HTTP GZIP压缩功能要提高网站访问速度_java生成压缩文件压缩率

    1. **GZIP压缩原理**:GZIP压缩通过查找文本中的重复模式并用较短的编码代替来实现数据压缩。这减少了在网络上传输的数据量,尤其是在传输大量静态内容如CSS、JavaScript和HTML文件时效果显著。 2. **JBoss配置**:...

    Gzip工具打包JS、CSS文件,后台解压缩

    本文将详细介绍如何使用Gzip来打包JS和CSS文件,并在Java后台通过Filter实现解压缩。 首先,我们需要了解Gzip的工作原理。Gzip基于DEFLATE算法,该算法结合了LZ77(一种无损数据压缩算法)和霍夫曼编码。它通过查找...

    基于Java的源码-JS和CSS压缩混淆 JsCompressor.zip

    这个Java源码实现的JS和CSS压缩混淆工具有以下几个核心功能: 1. **压缩**:压缩过程通常包括去除不必要的字符,如空格、换行和注释。这种压缩方法称为GZIP或Minify,它显著减小了文件大小,但并不改变代码的功能。...

    Java gzip压缩源码 web程序必备

    在Web服务器上启用Gzip压缩通常有两种方式:配置服务器(如Apache、Nginx)或通过Java的Servlet过滤器实现。在Java中,我们可以创建一个自定义的Servlet过滤器来动态地决定是否对特定请求进行Gzip压缩。 以下是一个...

    JAVA GZIP压缩案例附带httpwatch监测工具以及使用说明

    启用GZIP压缩可以显著减少HTTP请求的大小,特别是对于包含大量文本(如HTML、CSS、JavaScript)的页面。但是,需要注意的是,压缩也需要计算资源,因此在服务器性能较低或者请求响应时间很短的情况下,可能需要权衡...

    压缩CSS/JS等文件的工具

    其中,`yuicompressor-2.4.7.jar`是一个著名的CSS和JS压缩工具——YUI Compressor的Java版本。它由雅虎开发,能有效地压缩JavaScript和CSS,通过消除冗余代码和压缩语法,显著减小文件体积。 压缩JS文件的原理类似...

    gzip java ajax

    3. **压缩静态资源**:如CSS、JavaScript和图片等,可以预先进行gzip压缩,存储在服务器上,减少每次请求时的压缩开销。 4. **平衡压缩级别**:gzip有多个压缩级别,更高的级别意味着更小的文件但更长的压缩时间。...

    开启TOMCAT6的GZIP压缩

    为了提升用户体验并减轻网络带宽的压力,TOMCAT服务器可以通过启用GZIP压缩功能来优化数据传输。GZIP是一种常用的文件格式与数据压缩算法,能够显著减少文件大小,从而提高传输效率。对于使用TOMCAT6作为应用服务器...

    使用YUICompressor和DOS批处理脚本压缩JavaScript和CSS整理.pdf

    本文将详细介绍如何利用YUICompressor与DOS批处理脚本来高效地压缩JavaScript与CSS文件,同时结合IIS的GZIP功能进一步提高压缩率。 #### 二、YUICompressor简介 **YUICompressor**是由Yahoo!公司推出的一款开源...

    JS与css 压缩工具 yuicompressor.zip

    这款工具支持gzip压缩,且具备一定的错误检测功能,能在压缩过程中发现并报告潜在的语法错误。 二、yuicompressor功能 1. **代码压缩**:yuicompressor能够对JS和CSS文件进行压缩,删除无用的空格、换行和注释,使...

    Javascript开发之js压缩篇.docx

    本文详细介绍了JavaScript开发中两种常见的文件压缩技术——压缩混淆和GZIP压缩,并提供了具体的实现方案。通过合理地运用这些技术,不仅可以有效减少文件大小,提高页面加载速度,还能在一定程度上保护源代码免受...

    docker下nginx配置压缩字体和图片等配置

    Docker中的Nginx服务器作为一个流行的反向代理和负载均衡器,可以通过配置实现对字体、图片等静态资源的GZIP压缩。本文将详细介绍如何在Docker环境下配置Nginx以实现这一功能,主要涉及`docker-compose.yml`、`nginx...

    tomcat设置gzip压缩共2页.pdf.zip

    5. **压缩类型**:默认情况下,Tomcat只对某些MIME类型进行Gzip压缩,如文本、CSS和JavaScript。如果你希望对其他类型也进行压缩,可以通过`compressableMimeType`属性来指定。例如,`compressableMimeType="text/...

    J2EE gzip压缩

    其中,gzip压缩技术就是一种常见的优化手段,它能显著地减小HTML、JavaScript、CSS等静态资源的大小,从而提高页面加载速度,提升用户体验。本文将详细介绍如何在J2EE环境中实现gzip压缩,并探讨其原理与最佳实践。 ...

    JavaWeb的Gzip

    例如,已经经过压缩的图片、CSS和JavaScript文件,再进行Gzip压缩可能效果不明显,甚至可能导致反效果。因此,在实现GzipFilter时,可以考虑检查内容类型,只对文本内容进行压缩。 除了手动实现GzipFilter之外,...

    web容器文件压缩 tk-filter tk-filter js,jsp,css,文件压缩包含源代码

    在Web开发中,为了提高网页加载速度和优化用户体验,经常需要对JavaScript(js)、JavaServer Pages(jsp)和样式表(css)等静态资源进行压缩。`tk-filter` 是一个针对这种需求设计的过滤器(Filter),它适用于...

    Spring Boot(六十四):SpringBoot集成Gzip压缩数据

    Spring Boot本身并不直接提供Gzip压缩功能,但我们可以利用Spring MVC或Spring WebFlux的过滤器机制来实现这一功能。通常有两种方式: #### 2.1 使用Filter 创建一个自定义的`Filter`,实现Gzip的压缩与解压。以下...

    Tomcat7中开启gzip压缩功能的配置方法

    对于Apache Tomcat这种广泛使用的Java Web应用服务器,Tomcat 7版本提供了内置的支持以开启gzip压缩功能,从而帮助用户优化其Web应用的性能。 在Tomcat 7服务器中开启gzip压缩功能,主要通过修改Tomcat的配置文件来...

    JAVA文件压缩与解压缩实践(源代码+文档).zip

    `GZIPOutputStream`用于创建gzip压缩的文件,而`GZIPInputStream`用于读取gzip压缩的文件。 4. **Deflater与Inflater**: `Deflater`类用于提供数据的压缩功能,而`Inflater`用于解压缩。它们可以直接与字节数组或...

    tomcat设置gzip压缩的原理及配置方法

    在服务器端使用GZIP压缩响应数据可以减少传输的数据量,加快页面加载速度,特别对于文本数据如HTML、CSS、JavaScript、文本文件等压缩效果明显,可以减少大约70%-90%的数据量。本文将详细介绍在Apache Tomcat服务器...

Global site tag (gtag.js) - Google Analytics