参考:http://blog.csdn.net/a_heng/article/details/4579979
http://snowolf.iteye.com/blog/643443
import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; /** * 使用GZIPOutputStream重新创建ServletOutputStream类的write()。 * * @author Zhongqing.Lin * @since 2014年10月12日 上午8:37:55 */ public class GZipServletOutputStream extends ServletOutputStream { private GZIPOutputStream gzipOutputStream; @Override public boolean isReady() { return false; } public GZipServletOutputStream(ServletOutputStream servletOutputStream) throws IOException { super(); this.gzipOutputStream = new GZIPOutputStream(servletOutputStream); } public GZIPOutputStream getGzipOutputStream() { return gzipOutputStream; } public void finish() throws IOException { gzipOutputStream.finish(); } @Override public void setWriteListener(WriteListener listener) { } @Override public void write(int b) throws IOException { gzipOutputStream.write(b); } @Override public void write(byte[] b) throws IOException { gzipOutputStream.write(b); } @Override public void write(byte[] b, int off, int len) throws IOException { gzipOutputStream.write(b, off, len); } @Override public void flush() throws IOException { gzipOutputStream.flush(); } @Override public void close() throws IOException { gzipOutputStream.close(); } }
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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebFilter(filterName = "GZipServletResponseFilter", urlPatterns = {"/*"}) public class GZipServletResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String encoding = req.getHeader("Accept-Encoding"); //检查是否接受GZIP压缩 if ((encoding != null) && (encoding.indexOf("gzip") > -1)) { //创建响应封装器 GzipServletResponseWrapper respWrapper = new GzipServletResponseWrapper(resp); //设置响应内容编码为gzip格式。Content-Encoding单词首字母必须大写 respWrapper.setHeader("Content-Encoding", "gzip"); //调用下一个过滤器 chain.doFilter(req, respWrapper); respWrapper.flush(); } else { //若是请求头不接受压缩,直接调用下一个过滤器 chain.doFilter(req, resp); } } @Override public void destroy() { } }
/** * 用GZipOutputStream包装 * * @author Zhongqing.Lin * @since 2014年10月12日 上午8:38:48 */ public class GzipServletResponseWrapper extends HttpServletResponseWrapper { private GZipServletOutputStream gzServletOutputStream; private PrintWriter printWriter; public GzipServletResponseWrapper(HttpServletResponse response) { super(response); } @Override public ServletOutputStream getOutputStream() throws IOException { //遵循Servlet规范书中规定,在同一个请求期间,getWriter()和getOutputStream()只能择一调用; //若是已调用过getWriter(),再次调用getOutputStream()就抛出异常 if (printWriter != null) { throw new IllegalStateException(); } if (gzServletOutputStream == null) { gzServletOutputStream = new GZipServletOutputStream(getResponse().getOutputStream()); } return gzServletOutputStream; } @Override public PrintWriter getWriter() throws IOException { if (gzServletOutputStream != null) { throw new IllegalStateException(); } if (printWriter == null) { gzServletOutputStream = new GZipServletOutputStream(getResponse().getOutputStream()); OutputStreamWriter osw = new OutputStreamWriter(gzServletOutputStream, getResponse().getCharacterEncoding()); printWriter = new PrintWriter(osw); } return printWriter; } public GZIPOutputStream getGZipOutputStream() { if (this.gzServletOutputStream == null) { return null; } return this.gzServletOutputStream.getGzipOutputStream(); } public void flush() throws IOException { //如果printWriter被使用到,那么需要先将调用printWriter的flush()方法 if (printWriter != null) { printWriter.flush(); } //在输出流关闭前将压缩数据输写到输出流 gzServletOutputStream.finish(); } }
相关推荐
Java Gzip压缩是Web应用程序中常见的一种数据压缩技术,它基于GNU zip算法,可以有效减少网络传输的数据量,提高网页加载速度,节省带宽资源。本文将深入探讨Java中的Gzip压缩源码及其在Web程序中的应用。 首先,...
1. **GZIP压缩原理**:GZIP压缩通过查找文本中的重复模式并用较短的编码代替来实现数据压缩。这减少了在网络上传输的数据量,尤其是在传输大量静态内容如CSS、JavaScript和HTML文件时效果显著。 2. **JBoss配置**:...
在Web应用中,开启gzip压缩功能能够显著减小数据传输量,从而加快网页加载速度,降低服务器带宽消耗。以下是对EhCache开启gzip压缩功能的详细说明。 首先,gzip是一种广泛使用的数据压缩算法,尤其在Web服务器中,...
本文将详细介绍如何在Java中使用Filter过滤器,以及如何配置相关的配置文件,让你一目了然。 ### 1. Filter接口与生命周期 Filter是Servlet API中的一个接口,位于`javax.servlet`包下。它定义了三个关键方法: -...
在Java中,我们可以利用内置的java.util.zip.GZIPOutputStream和GZIPInputStream类来实现gzip压缩和解压缩。例如,服务器端可以通过GZIPOutputStream将响应内容压缩,然后通过HTTP头信息告知客户端数据已压缩,...
通过上述介绍,我们可以看出`Filter`在Java Web开发中的重要作用,它为我们提供了灵活的请求处理机制,使得我们能够方便地实现诸如安全控制、性能优化等高级功能。在实际项目中,合理利用`Filter`可以极大地提高应用...
Java Filter过滤机制是Java Servlet技术中的一个重要组成部分,它在Servlet 2.3版本中被引入,为Web应用程序提供了强大的预处理和后处理能力。Filter不是一个可以直接生成响应的Servlet,而是作为一个中间层,可以在...
通过这个"Java-filter测试程序",你可以实践并理解这些概念,创建自己的Filter来实现特定的功能,从而更好地掌握Java Web开发中的这一重要技术。在实际开发中,灵活运用Filter可以极大地提高代码的复用性和应用程序...
综上所述,Java Filter是Java Web开发中的关键组件,理解和熟练使用Filter能极大地增强你的应用程序的功能性和可维护性。通过深入学习和实践,你将能够利用Filter实现各种高效且灵活的解决方案。
本文将详细介绍如何使用Gzip来打包JS和CSS文件,并在Java后台通过Filter实现解压缩。 首先,我们需要了解Gzip的工作原理。Gzip基于DEFLATE算法,该算法结合了LZ77(一种无损数据压缩算法)和霍夫曼编码。它通过查找...
2. **过滤器(Filter)**:在Java应用中,我们也可以通过实现Servlet Filter来动态控制gzip压缩。创建一个实现了`javax.servlet.Filter`接口的类,然后在`doFilter`方法中检测请求和响应是否需要进行gzip处理。这种...
通过巧妙地使用Filter,我们可以实现如登录验证、GZIP压缩、性能监控、安全控制等多种功能,提高应用的可维护性和扩展性。在实际项目中,经常可以看到Filter与其他Java Web技术(如Servlet、JSP、Spring MVC)协同...
Spring Boot本身并不直接提供Gzip压缩功能,但我们可以利用Spring MVC或Spring WebFlux的过滤器机制来实现这一功能。通常有两种方式: #### 2.1 使用Filter 创建一个自定义的`Filter`,实现Gzip的压缩与解压。以下...
在本篇博客“java自学===Filter类的应用,网站数量统计”中,作者可能探讨了如何使用Filter来实现网站访问量的统计功能。 首先,Filter类位于javax.servlet包中,它是Servlet API的一部分,主要用于增强Web应用程序...
也可以使用Java-based配置或者注解方式来配置Filter。 5. **Filter的应用场景** - **权限控制**:Filter可以检查用户是否已登录,未登录的用户会被重定向到登录页面。 - **GZIP压缩**:为了提高网络传输效率,...
JavaWeb的Gzip技术是一种用于优化Web应用性能的方法,它通过使用Gzip压缩算法来减小HTTP响应的数据量,从而加快网页加载速度。Gzip在Web服务器和浏览器之间工作,当浏览器请求一个页面时,如果支持Gzip压缩,它会...
1. **HTTP压缩机制**:GZIP压缩是通过设置HTTP响应头中的`Content-Encoding`字段为`gzip`来告知客户端(浏览器)服务器返回的内容已被压缩。客户端收到这样的响应后,会自动解压内容。 2. **Filter机制**:在...
文章中介绍了两种解决方法:一、使用yui-compressor对js文件进行压缩混淆,二、使用gzip压缩来减少文件体积。 首先,作者提到使用ExtJS库时遇到的问题,即ExtJS庞大的体积如何进行压缩和优化。作者引入了OPOA组件式...
标题中的“通过filter实现对输出内容的压缩处理”是指在编程中使用过滤器(Filter)技术来对输出数据进行压缩,以减少网络传输的数据量,提高传输效率,节省带宽资源。这种技术常见于Web开发中,如Java的Servlet ...
这里主要探讨的是使用Java标准库中的`java.util.zip`包来实现数据的GZIP压缩。GZIP是一种广泛使用的数据压缩算法,它能有效地压缩文本、二进制数据,甚至XML、JSON等格式的数据。 在给定的代码示例中,`GzipServlet...