Java中使用filter机制来GZIP压缩网页
2009-09-22 14:37
447 查看
将response内响应给使用者的内容,使用GZIP压缩的方式回传给浏览器,而IE5和NS6也都有支持Gzip的压缩格式。
这个方法在之前就有人提出过,因为是让网页在输出时经过压缩,可以让传输量变小很多,虽然现在的网络频宽对于用来看网页已经绰绰有余,但是档案大小太大的网页还是会造成一定的影响。
经过Gzip压缩过的网页,档案大小可以到原本压缩前的20%。
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>
这个方法在之前就有人提出过,因为是让网页在输出时经过压缩,可以让传输量变小很多,虽然现在的网络频宽对于用来看网页已经绰绰有余,但是档案大小太大的网页还是会造成一定的影响。
经过Gzip压缩过的网页,档案大小可以到原本压缩前的20%。
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>
相关文章推荐
- java中GZIP压缩解压类使用实例
- 服务器使用Gzip压缩数据,加快网络传输(Java 例子)
- java---GZIP压缩技术演示(结合XML文档配置,网页显示)
- 使用java进行内容的压缩操作(gzip)
- 使用php判断网页是否gzip压缩
- 服务器使用Gzip压缩数据,加快网络传输(Java 例子)
- 使用GZIP和Zip压缩Java数据流(转)
- [Java]使用gzip对字符串进行压缩/解压
- 使用GZIP和Zip压缩Java数据流(转)
- Java使用GZIP进行压缩和解压缩(GZIPOutputStream,GZIPInputStream)
- JavaWeb Filter 过滤器的机制 与使用 请求重定向与请求转发的区别 跳转过滤,过滤器dispatcher REQUEST与FORWARD区别
- java 读取 C存放到Memcached中的网页GZIP压缩字符串、并解压出网页文本
- 服务器使用Gzip压缩数据,加快网络传输(Java 例子)
- java使用zip与gzip压缩字符串对比
- 使用php判断网页是否gzip压缩
- Java使用GZIP进行压缩和解压
- 使用filter实现网站的gzip压缩
- 过滤器(Filter)应用:全站压缩----Gzip网页压缩输出
- java使用Filter实现全栈压缩
- 尝试使用c++ gzlib和java GZIPOutputStream 读写gz压缩文件