最代码官方
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 Servlet的验证码生成代码
- java web servlet文件上传到服务器源代码下载
- 用servlet写的JPetStore,实现了全部基本功能
- java Servlet导出Excel的一个简单demo,不会受到框架的影响
- java servlet页面表格导出Excel(csv格式和xls格式都可以)
- java Servlet生成验证码图片工具类代码
请下载代码后再发表评论

- jsp/servlet 表单上传图片、但不能传值了、或传值中文乱码问题解决
- java servlet实现上传文件代码及其原理说明
- java servlet开发购物车功能,实现增删改查结算等功能。
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- 原证精 java servlet对html网页压缩后返回的过滤器代码实现
- 基于java Servlet的验证码生成代码
- 原 java web servlet文件上传到服务器源代码下载
- 用servlet写的JPetStore,实现了全部基本功能
- java servlet Filter的入门实例源代码下载
- java Servlet导出Excel的一个简单demo,不会受到框架的影响
- java servlet页面表格导出Excel(csv格式和xls格式都可以)
- 证 java Servlet生成验证码图片工具类代码


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日
q1248369851
2019年3月12日
暂无贡献等级