1 <Connector port="80" maxHttpHeaderSize="8192"
2 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
3 enableLookups="false" redirectPort="8443" acceptCount="100"
4 connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8"
5 compression="on"
6 compressionMinSize="2048"
7 noCompressionUserAgents="gozilla, traviata"
8 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
9 <!-- Note : To disable connection timeouts, set connectionTimeout value
10 to 0 -->
11
12 <!-- Note : To use gzip compression you could set the following properties :
13
14 compression="on"
15 compressionMinSize="2048"
16 noCompressionUserAgents="gozilla, traviata"
17 compressableMimeType="text/html,text/xml"
18 -->
其中
1) compression="on" 打开压缩功能
2) compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩
4) compressableMimeType="text/html,text/xml" 压缩类型
使用过滤器的方法如下:
package com.jsptw.filter; import java.io.*; import java.util.zip.GZIPOutputStream; import javax.servlet.*; import javax.servlet.http.*; public class GZIPEncodeFilter implements Filter { public void init(FilterConfig filterConfig) {} public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String transferEncoding = getGZIPEncoding((HttpServletRequest)request); if (transferEncoding == null) { chain.doFilter(request, response); } else { ((HttpServletResponse)response).setHeader("Content-Encoding", transferEncoding); GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response); chain.doFilter(request, wrappedResponse); wrappedResponse.flush(); } } public void destroy() {} private static String getGZIPEncoding(HttpServletRequest request) { String acceptEncoding = request.getHeader("Accept-Encoding"); if (acceptEncoding == null) return null; acceptEncoding = acceptEncoding.toLowerCase(); if (acceptEncoding.indexOf("x-gzip") >= 0) { return "x-gzip"; } if (acceptEncoding.indexOf("gzip") >= 0) { return "gzip"; } return null; } private class GZIPEncodableResponse extends HttpServletResponseWrapper { private GZIPServletStream wrappedOut; public GZIPEncodableResponse(HttpServletResponse response) throws IOException { super(response); wrappedOut = new GZIPServletStream(response.getOutputStream()); } public ServletOutputStream getOutputStream() throws IOException { return wrappedOut; } private PrintWriter wrappedWriter; public PrintWriter getWriter() throws IOException { if (wrappedWriter == null) { wrappedWriter = new PrintWriter( new OutputStreamWriter( getOutputStream(), getCharacterEncoding())); } return wrappedWriter; } public void flush() throws IOException { if (wrappedWriter != null) { wrappedWriter.flush(); } wrappedOut.finish(); } } private class GZIPServletStream extends ServletOutputStream { private GZIPOutputStream outputStream; public GZIPServletStream(OutputStream source) throws IOException { outputStream = new GZIPOutputStream(source); } public void finish() throws IOException { OutputStream.finish(); } public void write(byte[] buf) throws IOException { outputStream.write(buf); } public void write(byte[] buf, int off, int len) throws IOException { outputStream.write(buf, off, len); } public void write(int c) throws IOException { outputStream.write(c); } public void flush() throws IOException { outputStream.flush(); } public void close() throws IOException { outputStream.close(); } } }package com.jsptw.filter; import java.io.*; import java.util.zip.GZIPOutputStream; import javax.servlet.*; import javax.servlet.http.*; public class GZIPEncodeFilter implements Filter { public void init(FilterConfig filterConfig) {} public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String transferEncoding = getGZIPEncoding((HttpServletRequest)request); if (transferEncoding == null) { chain.doFilter(request, response); } else { ((HttpServletResponse)response).setHeader("Content-Encoding", transferEncoding); GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response); chain.doFilter(request, wrappedResponse); wrappedResponse.flush(); } } public void destroy() {} private static String getGZIPEncoding(HttpServletRequest request) { String acceptEncoding = request.getHeader("Accept-Encoding"); if (acceptEncoding == null) return null; acceptEncoding = acceptEncoding.toLowerCase(); if (acceptEncoding.indexOf("x-gzip") >= 0) { return "x-gzip"; } if (acceptEncoding.indexOf("gzip") >= 0) { return "gzip"; } return null; } private class GZIPEncodableResponse extends HttpServletResponseWrapper { private GZIPServletStream wrappedOut; public GZIPEncodableResponse(HttpServletResponse response) throws IOException { super(response); wrappedOut = new GZIPServletStream(response.getOutputStream()); } public ServletOutputStream getOutputStream() throws IOException { return wrappedOut; } private PrintWriter wrappedWriter; public PrintWriter getWriter() throws IOException { if (wrappedWriter == null) { wrappedWriter = new PrintWriter( new OutputStreamWriter( getOutputStream(), getCharacterEncoding())); } return wrappedWriter; } public void flush() throws IOException { if (wrappedWriter != null) { wrappedWriter.flush(); } wrappedOut.finish(); } } private class GZIPServletStream extends ServletOutputStream { private GZIPOutputStream outputStream; public GZIPServletStream(OutputStream source) throws IOException { outputStream = new GZIPOutputStream(source); } public void finish() throws IOException { OutputStream.finish(); } public void write(byte[] buf) throws IOException { outputStream.write(buf); } public void write(byte[] buf, int off, int len) throws IOException { outputStream.write(buf, off, len); } public void write(int c) throws IOException { outputStream.write(c); } public void flush() throws IOException { outputStream.flush(); } public void close() throws IOException { outputStream.close(); } } }web.xml中的设定为:<filter> <filter-name>GZIPEncoder</filter-name> <filter-class>com.jsptw.filter.GZIPEncodeFilter</filter-class> </filter> <filter-mapping> <filter-name> GZIPEncoder</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>