`
conkeyn
  • 浏览: 1528949 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Java中使用filter机制来GZIP压缩网页

 
阅读更多

参考: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程序必备

    Java Gzip压缩是Web应用程序中常见的一种数据压缩技术,它基于GNU zip算法,可以有效减少网络传输的数据量,提高网页加载速度,节省带宽资源。本文将深入探讨Java中的Gzip压缩源码及其在Web程序中的应用。 首先,...

    java开启JBoss的HTTP GZIP压缩功能要提高网站访问速度_java生成压缩文件压缩率

    1. **GZIP压缩原理**:GZIP压缩通过查找文本中的重复模式并用较短的编码代替来实现数据压缩。这减少了在网络上传输的数据量,尤其是在传输大量静态内容如CSS、JavaScript和HTML文件时效果显著。 2. **JBoss配置**:...

    EhCache开启gzip压缩功能

    在Web应用中,开启gzip压缩功能能够显著减小数据传输量,从而加快网页加载速度,降低服务器带宽消耗。以下是对EhCache开启gzip压缩功能的详细说明。 首先,gzip是一种广泛使用的数据压缩算法,尤其在Web服务器中,...

    java 中如何使用filter过滤器

    本文将详细介绍如何在Java中使用Filter过滤器,以及如何配置相关的配置文件,让你一目了然。 ### 1. Filter接口与生命周期 Filter是Servlet API中的一个接口,位于`javax.servlet`包下。它定义了三个关键方法: -...

    gzip java ajax

    在Java中,我们可以利用内置的java.util.zip.GZIPOutputStream和GZIPInputStream类来实现gzip压缩和解压缩。例如,服务器端可以通过GZIPOutputStream将响应内容压缩,然后通过HTTP头信息告知客户端数据已压缩,...

    java中的filter

    通过上述介绍,我们可以看出`Filter`在Java Web开发中的重要作用,它为我们提供了灵活的请求处理机制,使得我们能够方便地实现诸如安全控制、性能优化等高级功能。在实际项目中,合理利用`Filter`可以极大地提高应用...

    Java_Filter过滤机制详解.

    Java Filter过滤机制是Java Servlet技术中的一个重要组成部分,它在Servlet 2.3版本中被引入,为Web应用程序提供了强大的预处理和后处理能力。Filter不是一个可以直接生成响应的Servlet,而是作为一个中间层,可以在...

    Java-filter测试程序

    通过这个"Java-filter测试程序",你可以实践并理解这些概念,创建自己的Filter来实现特定的功能,从而更好地掌握Java Web开发中的这一重要技术。在实际开发中,灵活运用Filter可以极大地提高代码的复用性和应用程序...

    Java Filter相关资料

    综上所述,Java Filter是Java Web开发中的关键组件,理解和熟练使用Filter能极大地增强你的应用程序的功能性和可维护性。通过深入学习和实践,你将能够利用Filter实现各种高效且灵活的解决方案。

    Gzip工具打包JS、CSS文件,后台解压缩

    本文将详细介绍如何使用Gzip来打包JS和CSS文件,并在Java后台通过Filter实现解压缩。 首先,我们需要了解Gzip的工作原理。Gzip基于DEFLATE算法,该算法结合了LZ77(一种无损数据压缩算法)和霍夫曼编码。它通过查找...

    J2EE gzip压缩

    2. **过滤器(Filter)**:在Java应用中,我们也可以通过实现Servlet Filter来动态控制gzip压缩。创建一个实现了`javax.servlet.Filter`接口的类,然后在`doFilter`方法中检测请求和响应是否需要进行gzip处理。这种...

    java filter 执行过程例子

    通过巧妙地使用Filter,我们可以实现如登录验证、GZIP压缩、性能监控、安全控制等多种功能,提高应用的可维护性和扩展性。在实际项目中,经常可以看到Filter与其他Java Web技术(如Servlet、JSP、Spring MVC)协同...

    Spring Boot(六十四):SpringBoot集成Gzip压缩数据

    Spring Boot本身并不直接提供Gzip压缩功能,但我们可以利用Spring MVC或Spring WebFlux的过滤器机制来实现这一功能。通常有两种方式: #### 2.1 使用Filter 创建一个自定义的`Filter`,实现Gzip的压缩与解压。以下...

    java自学===Filter类的应用,网站数量统计

    在本篇博客“java自学===Filter类的应用,网站数量统计”中,作者可能探讨了如何使用Filter来实现网站访问量的统计功能。 首先,Filter类位于javax.servlet包中,它是Servlet API的一部分,主要用于增强Web应用程序...

    Java EE中Filter技术的研究与应用.zip

    也可以使用Java-based配置或者注解方式来配置Filter。 5. **Filter的应用场景** - **权限控制**:Filter可以检查用户是否已登录,未登录的用户会被重定向到登录页面。 - **GZIP压缩**:为了提高网络传输效率,...

    JavaWeb的Gzip

    JavaWeb的Gzip技术是一种用于优化Web应用性能的方法,它通过使用Gzip压缩算法来减小HTTP响应的数据量,从而加快网页加载速度。Gzip在Web服务器和浏览器之间工作,当浏览器请求一个页面时,如果支持Gzip压缩,它会...

    tomcat GZIP源码

    1. **HTTP压缩机制**:GZIP压缩是通过设置HTTP响应头中的`Content-Encoding`字段为`gzip`来告知客户端(浏览器)服务器返回的内容已被压缩。客户端收到这样的响应后,会自动解压内容。 2. **Filter机制**:在...

    Javascript开发之js压缩篇.pdf

    文章中介绍了两种解决方法:一、使用yui-compressor对js文件进行压缩混淆,二、使用gzip压缩来减少文件体积。 首先,作者提到使用ExtJS库时遇到的问题,即ExtJS庞大的体积如何进行压缩和优化。作者引入了OPOA组件式...

    通过filter实现对输出内容的压缩处理

    标题中的“通过filter实现对输出内容的压缩处理”是指在编程中使用过滤器(Filter)技术来对输出数据进行压缩,以减少网络传输的数据量,提高传输效率,节省带宽资源。这种技术常见于Web开发中,如Java的Servlet ...

    Java--数据的压缩[借鉴].pdf

    这里主要探讨的是使用Java标准库中的`java.util.zip`包来实现数据的GZIP压缩。GZIP是一种广泛使用的数据压缩算法,它能有效地压缩文本、二进制数据,甚至XML、JSON等格式的数据。 在给定的代码示例中,`GzipServlet...

Global site tag (gtag.js) - Google Analytics