`
shelltea
  • 浏览: 34629 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Gzip压缩和缓存过滤器

    博客分类:
  • Java
阅读更多

这段时间一直在使用Page Speed测试页面,一直出现以下几个问题:

Leverage proxy caching

Leverage browser caching

Enable compression

根据Google的建议,写了一个Filter来解决这三个问题,代码如下:

/*
 * GzipAndCacheFilter.java Jan 21, 2010 2:09:31 PM
 */
package org.shelltea.todo.web.filter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.GZIPOutputStream;

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;
import net.sf.ehcache.constructs.web.filter.FilterServletOutputStream;
import net.sf.ehcache.constructs.web.GenericResponseWrapper;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author shelltea
 * 
 */
public class GzipAndCacheFilter implements Filter {
	private static final Logger LOG = LoggerFactory
			.getLogger(GzipAndCacheFilter.class);

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		final HttpServletRequest httpRequest = (HttpServletRequest) request;
		final HttpServletResponse httpResponse = (HttpServletResponse) response;

		if (acceptsGzipEncoding(httpRequest)) {
			if (LOG.isDebugEnabled()) {
				LOG.debug("gzip:" + httpRequest.getRequestURL());
			}

			// 创建gzip stream
			final ByteArrayOutputStream compressed = new ByteArrayOutputStream();
			final GZIPOutputStream gzout = new GZIPOutputStream(compressed);

			// 处理request
			final GenericResponseWrapper wrapper = new GenericResponseWrapper(
					httpResponse, gzout);
			chain.doFilter(request, wrapper);
			wrapper.flush();

			gzout.close();

			int statusCode = wrapper.getStatus();
			if (statusCode != HttpServletResponse.SC_OK) {
				return;
			}

			byte[] compressedBytes = compressed.toByteArray();

			httpResponse.setHeader("Content-Encoding", "gzip");

			addCacheControl(httpResponse, httpRequest);

			response.setContentLength(compressedBytes.length);
			response.getOutputStream().write(compressedBytes);

		} else {
			chain.doFilter(request, response);
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}

	private boolean acceptsGzipEncoding(HttpServletRequest request) {
		return acceptsEncoding(request, "gzip");
	}

	private boolean acceptsEncoding(final HttpServletRequest request,
			final String name) {
		final boolean accepts = headerContains(request, "Accept-Encoding", name);
		return accepts;
	}

	private boolean headerContains(final HttpServletRequest request,
			final String header, final String value) {
		final Enumeration<?> accepted = request.getHeaders(header);
		while (accepted.hasMoreElements()) {
			final String headerValue = (String) accepted.nextElement();
			if (headerValue.indexOf(value) != -1) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 根据不同的资源采用不同的缓存策略
	 * 
	 * @param httpResponse
	 * @param httpRequest
	 */
	private void addCacheControl(HttpServletResponse httpResponse,
			HttpServletRequest httpRequest) {
		String URL = httpRequest.getRequestURL().toString();

		if (URL.charAt(URL.length() - 1) == '/') {
			httpResponse.setHeader("Cache-Control", "private, max-age=0");
			httpResponse.setHeader("Expires", "-1");
			return;
		}
		httpResponse.setHeader("Cache-Control", "public, max-age=31536000");
		httpResponse.setHeader("Vary", "Accept-Encoding");
	}
}

代码中的GenericResponseWrapper和FilterServletOutputStream是引用ehcache-web。

在web.xml中加入此过滤器:

 <filter>
  <filter-name>GzipAndCache</filter-name>
  <filter-class>org.shelltea.todo.web.filter.GzipAndCacheFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>GzipAndCache</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 以下是使用此过滤器后的Page Speed分析结果:

 

 

  • 大小: 28.2 KB
0
0
分享到:
评论

相关推荐

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

    9. **安全性考虑**:GZIP压缩可能会使某些攻击变得更加复杂,例如跨站脚本(XSS)和注入攻击。因此,在启用GZIP的同时,确保应用程序的安全性同样重要。 通过理解这些知识点并正确地在JBoss中配置GZIP压缩,可以...

    一键开启Windows IIS GZIP压缩工具

    3. 使用`adsutil.vbs`的命令行语法,如`adsutil.set W3SVC/Filters/GZIP/State 1`,设置GZIP过滤器的状态为启用(1)。 4. 可能还会涉及其他配置,如设置压缩阈值、缓存大小等。 在IIS 7及更高版本中,启用GZIP压缩...

    Delphi DataSnap加密压缩组件

    2. **压缩过滤器**:可能使用GZIP、ZLIB等压缩算法,减小数据体积,加快传输速度。 3. **身份验证过滤器**:可能实现基本的HTTP认证或其他更安全的认证机制,如OAuth,保护服务免受未经授权的访问。 4. **数据转换...

    几个有用的过滤器 小技巧

    6. **静态资源缓存过滤器**: 对于不会频繁更改的静态资源(如CSS、JavaScript文件),我们可以设置一个过滤器来设置HTTP响应头,使浏览器缓存这些资源,减少不必要的网络请求。 7. **SSL强制过滤器**: 如果你的...

    java 常用过滤器

    GZIP压缩过滤器能够减少网络传输的数据量,提高页面加载速度。它在响应发送给客户端前,先将其压缩,客户端接收后自动解压。实现这一功能的过滤器如 `GzipFilter`,会检查请求头中的 `Accept-Encoding` 来决定是否...

    java过滤器例子

    Java过滤器,全称为Servlet Filter,在Java Web开发中扮演着重要的角色。...通过使用过滤器,开发者...在实际项目中,可以根据需求创建各种自定义过滤器,如缓存控制、GZIP压缩、安全过滤等,以实现更加灵活和强大的功能。

    J2EE gzip压缩

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

    过滤器的编写

    - **GZIP压缩**:对响应内容进行压缩,减少网络传输的数据量,提高性能。 - **缓存控制**:设置HTTP头信息,控制浏览器的缓存策略。 6. **Java Servlet API中的Filter接口** 在Java Web开发中,我们通常使用...

    java中五种常用的过滤器

    以上五个过滤器涵盖了常见的Web开发需求,如缓存控制、登录验证、字符编码、数据压缩和URL重写。熟练掌握这些过滤器的使用,可以显著提升Java Web应用的功能性和性能。在实际项目中,可以根据需求灵活组合和定制过滤...

    过滤器与拦截器的区别

    过滤器和拦截器是两种在Java Web开发中用于处理请求的机制,它们在功能上有相似之处,但在实现方式和使用场景上存在显著区别。这里我们将深入探讨这两种技术,以及它们在Spring MVC框架中的应用。 首先,拦截器是...

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

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

    过滤器 java servlet

    每个过滤器都有机会处理请求和响应,然后传递给下一个过滤器,直到最后一个过滤器将处理结果传递给目标Servlet。 ### 3. 过滤器配置 在传统的XML配置中,过滤器的配置通常在`web.xml`文件中完成,包括定义过滤器类...

    jsp过滤器的使用(含一个project实例说明)

    - **GZIP压缩**:对响应内容进行压缩,减少网络传输的数据量。 总结,JSP过滤器是Java Web开发中的重要工具,它允许我们在请求到达目标资源之前进行干预,实现各种定制化功能。通过实际项目练习,我们可以更好地...

    java 中如何使用filter过滤器

    在Java Web开发中,Filter(过滤器)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细介绍如何在Java中使用Filter过滤器,以及如何配置相关的配置文件,让你一目了然。 ### 1. Filter...

    9. 过滤器.zip过滤器

    3. **性能优化**:缓存处理,比如对静态资源进行GZIP压缩,减少网络传输量。 4. **日志记录**:记录请求信息,便于分析系统行为和调试。 5. **过滤内容**:如去除HTML标签,防止XSS攻击。 6. **国际化和本地化**:...

    自己写的一个url过滤器

    6. **性能优化**: 过滤器还可以用于性能优化,如缓存控制、GZIP压缩等。通过在过滤器中实现这些功能,可以减少服务器负载,提高用户访问速度。 7. **部署与测试**: 自定义的URL过滤器需要正确地部署到Web应用服务器...

    java过滤器

    3. **GZIP压缩**:为了提高页面加载速度,过滤器可以检测客户端是否接受GZIP压缩,然后对响应内容进行压缩。 4. **日志记录**:过滤器可以拦截请求和响应,记录关键信息,帮助开发者调试和监控应用状态。 5. **缓存...

    监听器 过滤器 详解

    - **性能优化**:通过缓存策略、GZIP压缩等手段提高系统性能。 - **国际化和本地化**:监听器可以用来切换用户的语言环境。 - **数据转换**:过滤器可以自动转换请求参数格式,如将字符串转换为日期等。 在学习这两...

    javaweb过滤器

    4. **全站GZIP压缩过滤器**:虽然实现起来较为复杂,但能显著减少传输的数据量,提高性能。 #### 巩固包装设计模式——装饰模式 1. **装饰模式的基本步骤**: - 定义一个接口,该接口定义了一组基本的操作。 - ...

Global site tag (gtag.js) - Google Analytics