最代码官方
2014-09-26 16:14:23
证精
java servlet Filter实现gzip压缩机制的源代码分享
在java提供接口给客户端开发中,可以启动gzip压缩机制来达到减小文件大小的目的。
相关java代码如下:
GZIPFilter.java
package com.zuidaima.filter;
import java.io.IOException;
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;
public class GZIPFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
if (req instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
boolean isGzip = false;
String gzip = request.getParameter("gzip");//根据请求参数启用gzip机制
if (gzip != null && gzip.equals("true")) {
isGzip = true;
}
String ae = request.getHeader("Accept-Encoding");
if (ae != null && ae.indexOf("gzip") != -1) {//根据客户端agent请求参数来启用gzip机制
isGzip = true;
}
if (isGzip) {
GZIPResponseWrapper wrappedResponse = new GZIPResponseWrapper(
response);
chain.doFilter(req, wrappedResponse);
wrappedResponse.finishResponse();
return;
}
chain.doFilter(req, res);
}
}
public void init(FilterConfig filterConfig) {
}
public void destroy() {
}
}
GZIPResponseStream.java
package com.zuidaima.filter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
public class GZIPResponseStream extends ServletOutputStream {
protected ByteArrayOutputStream baos = null;
protected GZIPOutputStream gzipstream = null;
protected boolean closed = false;
protected HttpServletResponse response = null;
protected ServletOutputStream output = null;
public GZIPResponseStream(HttpServletResponse response) throws IOException {
super();
closed = false;
this.response = response;
this.output = response.getOutputStream();
baos = new ByteArrayOutputStream();
gzipstream = new GZIPOutputStream(baos);
}
public void close() throws IOException {
if (closed) {
throw new IOException("This output stream has already been closed");
}
gzipstream.finish();
byte[] bytes = baos.toByteArray();
response.addHeader("Content-Length", Integer.toString(bytes.length));
response.addHeader("Content-Encoding", "gzip");
output.write(bytes);
output.flush();
output.close();
closed = true;
}
public void flush() throws IOException {
if (closed) {
throw new IOException("Cannot flush a closed output stream");
}
gzipstream.flush();
}
public void write(int b) throws IOException {
if (closed) {
throw new IOException("Cannot write to a closed output stream");
}
gzipstream.write((byte) b);
}
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
public void write(byte b[], int off, int len) throws IOException {
if (closed) {
throw new IOException("Cannot write to a closed output stream");
}
gzipstream.write(b, off, len);
}
public boolean closed() {
return (this.closed);
}
public void reset() {
// noop
}
}
GZIPResponseWrapper.java
package com.zuidaima.filter;
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 GZIPResponseWrapper extends HttpServletResponseWrapper {
protected HttpServletResponse origResponse = null;
protected ServletOutputStream stream = null;
protected PrintWriter writer = null;
public GZIPResponseWrapper(HttpServletResponse response) {
super(response);
origResponse = response;
}
public ServletOutputStream createOutputStream() throws IOException {
return (new GZIPResponseStream(origResponse));
}
public void finishResponse() {
try {
if (writer != null) {
writer.close();
} else {
if (stream != null) {
stream.close();
}
}
} catch (IOException e) {
}
}
public void flushBuffer() throws IOException {
stream.flush();
}
public ServletOutputStream getOutputStream() throws IOException {
if (writer != null) {
throw new IllegalStateException(
"getWriter() has already been called!");
}
if (stream == null)
stream = createOutputStream();
return (stream);
}
public PrintWriter getWriter() throws IOException {
if (writer != null) {
return (writer);
}
if (stream != null) {
throw new IllegalStateException(
"getOutputStream() has already been called!");
}
stream = createOutputStream();
writer = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));
return (writer);
}
public void setContentLength(int length) {
}
}
web.xml中配置如下:
<filter> <filter-name>GZIPFilter</filter-name> <filter-class>com.zuidaima.filter.GZIPFilter</filter-class> </filter> <filter-mapping> <filter-name>GZIPFilter</filter-name> <url-pattern>*.htm</url-pattern> </filter-mapping>
未启用gzip压缩前响应头信息:
启用gizp压缩后响应头信息:
猜你喜欢
- java servlet对html网页压缩后返回的过滤器代码实现
- java servlet Filter的入门实例源代码下载
- jsp/servlet 表单上传图片、但不能传值了、或传值中文乱码问题解决
- java servlet实现上传文件代码及其原理说明
- java servlet开发购物车功能,实现增删改查结算等功能。
- 基于java Servlet的验证码生成代码
- java web servlet文件上传到服务器源代码下载
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- 用servlet写的JPetStore,实现了全部基本功能
- java Servlet导出Excel的一个简单demo,不会受到框架的影响
- java servlet页面表格导出Excel(csv格式和xls格式都可以)
- java Servlet生成验证码图片工具类代码
请下载代码后再发表评论
相关代码
- jsp/servlet 表单上传图片、但不能传值了、或传值中文乱码问题解决
- java servlet实现上传文件代码及其原理说明
- java servlet开发购物车功能,实现增删改查结算等功能。
- 原证精 java servlet对html网页压缩后返回的过滤器代码实现
- 基于java Servlet的验证码生成代码
- 原 java web servlet文件上传到服务器源代码下载
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- 用servlet写的JPetStore,实现了全部基本功能
- java servlet Filter的入门实例源代码下载
- java Servlet导出Excel的一个简单demo,不会受到框架的影响
- java servlet页面表格导出Excel(csv格式和xls格式都可以)
- 证 java Servlet生成验证码图片工具类代码
最近下载
最近浏览
微信网友_6446523832586240 LV1
2024年2月29日
yymmdm LV6
2022年8月10日
cindyd LV1
2021年11月2日
cc900118 LV17
2021年8月26日
oo3534 LV2
2020年10月10日
javaxiaobai1 LV3
2020年5月25日
wei112233 LV15
2020年4月2日
luohaipeng LV23
2019年12月3日
最代码安逸 LV15
2019年9月8日
lf0120 LV1
2019年7月31日





