`
John_Kong19
  • 浏览: 279722 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用gzip优化web应用(filter实现)

阅读更多
相关知识:

  gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果开启Gzip ,那么服务器端响应后,会将页面,JS,CSS等文本文件或者其他文件通过高压缩算法将其压缩,然后传输到客户端,由客户端的浏览器负责解压缩与呈现。通常能节省40%以上的流量(一般都有60%左右),一些PHP,JSP文件也能够进行压缩。

实      现:  

Tomcat 开启Gzip :

1.找到Tomcat 目录下的conf下的server.xml,并找到如下信息

Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"
将它改成如下的形式(其实在上面代码的下面已经有了,将他们打开而已。):

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml" >
这样,就能够对html和xml进行压缩了,如果要压缩css 和 js,那么需要将

compressableMimeType=”text/html,text/xml”加入css和js:

<Connector port="8080" ......... compressableMimeType="text/html,text/xml,text/css,text/javascript" >
你甚至可以压缩图片:

compressableMimeType=”text/html,text/xml”加入css和js:

<Connector port="8080" ......... compressableMimeType="text/html,text/xml,text/css,text/javascript,image/gif,image/jpg" >
开启后重启Tomcat ,通过浏览器查看headers信息就能看到是否开启(firebug中有),如果开启了,那么transfer-encoding就会是Gzip,否则就是chunked。



在代码级别完成web应用的gzip压缩的开启:



1.Wrapper  用来包装HttpServletResponse 对象

Java代码 public class Wrapper extends HttpServletResponseWrapper
{
public static final int OT_NONE = 0, OT_WRITER = 1, OT_STREAM = 2;
private int outputType = OT_NONE;
private ServletOutputStream output = null;
private PrintWriter writer = null;
private ByteArrayOutputStream buffer = null;
public Wrapper(HttpServletResponse resp) throws IOException {
super(resp);
buffer = new ByteArrayOutputStream();
}
public PrintWriter getWriter() throws IOException {
if(outputType==OT_STREAM)
throw new IllegalStateException();
else if(outputType==OT_WRITER)
return writer;
else {
outputType = OT_WRITER;
writer = new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding()));
return writer;
}
}
public ServletOutputStream getOutputStream() throws IOException {
if(outputType==OT_WRITER)
throw new IllegalStateException();
else if(outputType==OT_STREAM)
return output;
else {
outputType = OT_STREAM;
output = new WrappedOutputStream(buffer);
return output;
}
}
public void flushBuffer() throws IOException {
if(outputType==OT_WRITER)
writer.flush();
if(outputType==OT_STREAM)
output.flush();
}
public void reset() {
outputType = OT_NONE;
buffer.reset();
}
public byte[] getResponseData() throws IOException {
flushBuffer();
return buffer.toByteArray();

}
class WrappedOutputStream extends ServletOutputStream {
private ByteArrayOutputStream buffer;
public WrappedOutputStream(ByteArrayOutputStream buffer) {
this.buffer = buffer;
}
public void write(int b) throws IOException {
buffer.write(b);
}
public byte[] toByteArray() {
return buffer.toByteArray();
}
}
}
package com.shop.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class Wrapper extends HttpServletResponseWrapper {
    public static final int OT_NONE = 0, OT_WRITER = 1, OT_STREAM = 2;
    private int outputType = OT_NONE;
    private ServletOutputStream output = null;
    private PrintWriter writer = null;
    private ByteArrayOutputStream buffer = null;

    public Wrapper(HttpServletResponse resp) throws IOException {
        super(resp);
        buffer = new ByteArrayOutputStream();
    }

    public PrintWriter getWriter() throws IOException {
        if (outputType == OT_STREAM)
            throw new IllegalStateException();
        else if (outputType == OT_WRITER)
            return writer;
        else {
            outputType = OT_WRITER;
            writer = new PrintWriter(new OutputStreamWriter(buffer,
                    getCharacterEncoding()));
            return writer;
        }
    }

    public ServletOutputStream getOutputStream() throws IOException {
        if (outputType == OT_WRITER)
            throw new IllegalStateException();
        else if (outputType == OT_STREAM)
            return output;
        else {
            outputType = OT_STREAM;
            output = new WrappedOutputStream(buffer);
            return output;
        }
    }

    public void flushBuffer() throws IOException {
        if (outputType == OT_WRITER)
            writer.flush();
        if (outputType == OT_STREAM)
            output.flush();
    }

    public void reset() {
        outputType = OT_NONE;
        buffer.reset();
    }

    public byte[] getResponseData() throws IOException {
        flushBuffer();
        return buffer.toByteArray();

    }

    class WrappedOutputStream extends ServletOutputStream {
        private ByteArrayOutputStream buffer;

        public WrappedOutputStream(ByteArrayOutputStream buffer) {
            this.buffer = buffer;
        }

        public void write(int b) throws IOException {
            buffer.write(b);
        }

        public byte[] toByteArray() {
            return buffer.toByteArray();
        }
    }
}






2.过滤器



Java代码 public class GZipFilter implements Filter
{

public void destroy()
{
  // TODO Auto-generated method stub
 
}

public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException
   {
   System.out.println("进入过滤器");
   HttpServletResponse resp = (HttpServletResponse)response;
   Wrapper wrapper = new Wrapper(resp);
   chain.doFilter(request, wrapper);
   byte[] gzipData = gzip(wrapper.getResponseData());
   resp.addHeader("Content-Encoding", "gzip");
   resp.setContentLength(gzipData.length);
   ServletOutputStream output = response.getOutputStream();
   output.write(gzipData);
   output.flush();
   }

public void init(FilterConfig arg0) throws ServletException
{
  // TODO Auto-generated method stub
 
}

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();
  }

}


package com.shop.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GZipFilter implements Filter {

    public void destroy() {
    }
      /**
       * 判断浏览器是否支持GZIP
       * @param request
       * @return
       */
      private static boolean isGZipEncoding(HttpServletRequest request){
        boolean flag=false;
        String encoding=request.getHeader("Accept-Encoding");
        if(encoding.indexOf("gzip")!=-1){
          flag=true;
        }
        return flag;
      }
     
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpServletRequest req=(HttpServletRequest)request;
        if(isGZipEncoding(req)){
            Wrapper wrapper = new Wrapper(resp);
            chain.doFilter(request, wrapper);
            byte[] gzipData = gzip(wrapper.getResponseData());
            resp.addHeader("Content-Encoding", "gzip");
            resp.setContentLength(gzipData.length);
            ServletOutputStream output = response.getOutputStream();
            output.write(gzipData);
            output.flush();
        } else {
            chain.doFilter(request, response);
        }       

    }

    public void init(FilterConfig arg0) throws ServletException {

    }

    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();
    }

}

3.在web.xml中配置 GZipFilter,当我们访问应用中以.do结尾的资源的使用,服务器端就开启http gzip压缩,将压缩后的信息通过http 协议传递给浏览器. 

  

Xml代码 <filter> 

  <filter-name>ecsideExport</filter-name> 

  <filter-class>com.web.servlet.GZipFilter</filter-class> 

</filter> 

<filter-mapping> 

             <filter-name>ecsideExport</filter-name> 

            <url-pattern>*.do</url-pattern> 

</filter-mapping>  
分享到:
评论

相关推荐

    Web后端开发-使用Filter过滤器技术,实现访问量统计

    1. `@WebFilter`注解:这个注解可以直接应用到Filter类上,用于声明Filter的基本信息,如过滤的URL模式、过滤器名称等。例如: ```java @WebFilter(filterName = "访问量统计Filter", urlPatterns = "/*") public ...

    J2EE之filter的应用

    4. **GZIP 压缩**:通过 Filter 实现响应内容的 GZIP 压缩,减少网络传输的数据量,提高性能。 5. **缓存控制**:Filter 可以控制资源是否需要从缓存中读取或更新缓存。 6. **安全过滤**:对请求参数进行检查和过滤...

    JavaWeb的Gzip

    JavaWeb的Gzip技术是一种用于优化Web应用性能的方法,它通过使用Gzip压缩算法来减小HTTP响应的数据量,从而加快网页加载速度。Gzip在Web服务器和浏览器之间工作,当浏览器请求一个页面时,如果支持Gzip压缩,它会...

    gzip java ajax

    在IT行业中,gzip是一种广泛使用的数据压缩算法,尤其在Web应用中扮演着重要角色。它能够有效地减小网络传输的数据量,从而提高页面加载速度,节省带宽资源。Java、AJAX(异步JavaScript和XML)是Web开发中的关键...

    简单使用Filter模拟Servlet中的过滤器

    通过理解和熟练使用Filter,开发者可以更好地控制和优化Web应用程序的行为。 由于提供的压缩包文件名为`webfilter`,可能包含了示例代码或者项目的配置文件,这些内容可以进一步帮助理解Filter的工作方式和应用场景...

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

    在Web开发中,为了提高网页加载速度和优化用户体验,经常...解压后,开发者可以根据提供的文档或示例来集成`tk-filter`到自己的Web应用中,通过调整配置,实现对js、jsp和css文件的有效压缩,从而提升网站的整体性能。

    Java-filter测试程序

    4. **Filter链**:在一个Web应用中,可以有多个Filter,它们组成一个Filter链。当请求到达时,Filter会按照配置的顺序依次执行,直到请求传递到目标资源。 5. **Filter的实际应用**: - **安全控制**:Filter可以...

    通过filter实现对输出内容的压缩处理

    标题中的“通过filter实现对输出内容的压缩处理”是指在编程中使用过滤器(Filter)技术来对输出数据进行压缩,以减少网络传输的数据量,提高传输效率,节省带宽资源。这种技术常见于Web开发中,如Java的Servlet ...

    java中的filter

    - **初始化**:每当Web应用启动时,每个`Filter`实例都会调用一次`init()`方法,传递一个`FilterConfig`对象,包含了`Filter`的初始化参数。 - **执行**:每次匹配的请求到达时,`doFilter()`方法被调用,它会按...

    tomcat GZIP源码

    5. **自定义配置**:Tomcat的GZIP源码通常允许开发者通过web.xml配置文件调整过滤器的行为,例如设置最小压缩长度、启用或禁用GZIP,以及选择性地对某些类型的资源应用压缩。 6. **多线程安全**:在高并发环境下,...

    (四)Jsp filter的简单使用

    4. **性能优化**:例如,使用GZIP Filter对响应内容进行压缩,减少网络传输量。 在实际开发中,Filter可以极大地提高应用的灵活性和可维护性,通过合理的Filter设计,可以解耦业务逻辑,使代码结构更加清晰。 以上...

    Java EE中Filter技术的研究与应用.zip

    在Java EE(企业版)平台中,Filter技术是核心...总之,Java EE中的Filter技术是构建高效、灵活Web应用程序的关键工具。理解并熟练运用Filter,可以帮助开发者更好地实现功能扩展和优化,提高系统的整体性能和稳定性。

    Servlet--2.filter

    通过深入学习"Servlet--2.filter",你将能更好地控制和优化Web应用的流程,提高系统的可维护性和安全性。在实际项目中,结合实际需求灵活运用Filter,可以解决许多复杂的问题,如性能优化、安全防护等。

    java自学===Filter类的应用,验证用户

    在Java世界中,Servlet Filter是实现Web应用程序动态拦截请求的重要工具。`Filter`类的应用主要体现在对HTTP请求和响应进行预处理和后处理,比如权限验证、数据编码转换、日志记录等。在这个主题中,我们将深入探讨...

    EhCache开启gzip压缩功能

    EhCache是一款流行的Java缓存系统...综上所述,EhCache开启gzip压缩功能是优化Web应用性能的有效手段,能够减少网络延迟,提高用户体验。同时,正确地配置和使用gzip压缩,还需考虑浏览器兼容性以及服务器资源的平衡。

    Servlet之Filter深入讲解及实例研究

    - **性能优化**:如GZIP压缩,减少网络传输的数据量。 6. **Spring MVC中的Filter** 在Spring MVC中,虽然Controller承担了大部分业务逻辑,但Filter依然有用武之地,可以用于拦截和处理请求。Spring提供了一种更...

    过滤器(Filter)

    过滤器可以用来实现诸如登录验证、数据转换、日志记录等功能,为Web应用程序提供了强大的扩展性。 首先,我们需要理解过滤器的基本工作原理。当用户向服务器发送一个请求时,过滤器会按照在web.xml中的配置顺序被...

    使用filter拦截servlet和jsp页面的内容,进行过滤后输出

    为了增强应用程序的安全性、性能优化或者实现特定的功能,我们常常会使用过滤器(Filter)来拦截请求和响应。本文将详细介绍如何使用filter来对servlet和jsp页面的内容进行过滤,并在过滤后输出。 首先,了解...

    JSP-Filter的简单练习

    **JSP(JavaServer Pages)**是一种...通过合理配置和使用Filter,我们可以实现更灵活、更高效的Web应用程序。在学习和实践过程中,结合源码分析和开发工具,能更深入地理解其工作机制,从而更好地应用于实际项目中。

    Java Filter相关资料

    综上所述,Java Filter是Java Web开发中的关键组件,理解和熟练使用Filter能极大地增强你的应用程序的功能性和可维护性。通过深入学习和实践,你将能够利用Filter实现各种高效且灵活的解决方案。

Global site tag (gtag.js) - Google Analytics