最代码官方
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实现上传文件代码及其原理说明
- 基于java Servlet的验证码生成代码
- java Servlet生成验证码图片工具类代码
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- java servlet Filter的入门实例源代码下载
- java servlet上传文件可判断文件类型、大小、支持批量的脚本代码
- java servlet无刷新上传图片文件并裁剪demo代码(Jcrop)
- java web字符集编码过滤器实例代码下载
- java org.apache.tools.zip压缩多个文件工具类代码
- spring mvc自定义过滤器filter实现对请求参数编解码的代码分享
- 用servlet写的JPetStore,实现了全部基本功能
请下载代码后再发表评论
相关代码
- java servlet实现上传文件代码及其原理说明
- jsp/servlet 表单上传图片、但不能传值了、或传值中文乱码问题解决
- java servlet开发购物车功能,实现增删改查结算等功能。
- 基于java Servlet的验证码生成代码
- 用servlet写的JPetStore,实现了全部基本功能
- 原 java web servlet文件上传到服务器源代码下载
- 原证精 java servlet对html网页压缩后返回的过滤器代码实现
- java servlet写的一个可以显示用户的分数,有源代码和数据库
- 证 java Servlet生成验证码图片工具类代码
- java servlet Filter的入门实例源代码下载
- 原 java servlet集成润乾报表实例
- java servlet开发CAS单点登录Demo
最近下载
最近浏览
微信网友_6446523832586240 LV1
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日