这段时间一直在使用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
分享到:
相关推荐
9. **安全性考虑**:GZIP压缩可能会使某些攻击变得更加复杂,例如跨站脚本(XSS)和注入攻击。因此,在启用GZIP的同时,确保应用程序的安全性同样重要。 通过理解这些知识点并正确地在JBoss中配置GZIP压缩,可以...
3. 使用`adsutil.vbs`的命令行语法,如`adsutil.set W3SVC/Filters/GZIP/State 1`,设置GZIP过滤器的状态为启用(1)。 4. 可能还会涉及其他配置,如设置压缩阈值、缓存大小等。 在IIS 7及更高版本中,启用GZIP压缩...
2. **压缩过滤器**:可能使用GZIP、ZLIB等压缩算法,减小数据体积,加快传输速度。 3. **身份验证过滤器**:可能实现基本的HTTP认证或其他更安全的认证机制,如OAuth,保护服务免受未经授权的访问。 4. **数据转换...
6. **静态资源缓存过滤器**: 对于不会频繁更改的静态资源(如CSS、JavaScript文件),我们可以设置一个过滤器来设置HTTP响应头,使浏览器缓存这些资源,减少不必要的网络请求。 7. **SSL强制过滤器**: 如果你的...
GZIP压缩过滤器能够减少网络传输的数据量,提高页面加载速度。它在响应发送给客户端前,先将其压缩,客户端接收后自动解压。实现这一功能的过滤器如 `GzipFilter`,会检查请求头中的 `Accept-Encoding` 来决定是否...
Java过滤器,全称为Servlet Filter,在Java Web开发中扮演着重要的角色。...通过使用过滤器,开发者...在实际项目中,可以根据需求创建各种自定义过滤器,如缓存控制、GZIP压缩、安全过滤等,以实现更加灵活和强大的功能。
2. **过滤器(Filter)**:在Java应用中,我们也可以通过实现Servlet Filter来动态控制gzip压缩。创建一个实现了`javax.servlet.Filter`接口的类,然后在`doFilter`方法中检测请求和响应是否需要进行gzip处理。这种...
- **GZIP压缩**:对响应内容进行压缩,减少网络传输的数据量,提高性能。 - **缓存控制**:设置HTTP头信息,控制浏览器的缓存策略。 6. **Java Servlet API中的Filter接口** 在Java Web开发中,我们通常使用...
以上五个过滤器涵盖了常见的Web开发需求,如缓存控制、登录验证、字符编码、数据压缩和URL重写。熟练掌握这些过滤器的使用,可以显著提升Java Web应用的功能性和性能。在实际项目中,可以根据需求灵活组合和定制过滤...
过滤器和拦截器是两种在Java Web开发中用于处理请求的机制,它们在功能上有相似之处,但在实现方式和使用场景上存在显著区别。这里我们将深入探讨这两种技术,以及它们在Spring MVC框架中的应用。 首先,拦截器是...
Spring Boot本身并不直接提供Gzip压缩功能,但我们可以利用Spring MVC或Spring WebFlux的过滤器机制来实现这一功能。通常有两种方式: #### 2.1 使用Filter 创建一个自定义的`Filter`,实现Gzip的压缩与解压。以下...
每个过滤器都有机会处理请求和响应,然后传递给下一个过滤器,直到最后一个过滤器将处理结果传递给目标Servlet。 ### 3. 过滤器配置 在传统的XML配置中,过滤器的配置通常在`web.xml`文件中完成,包括定义过滤器类...
- **GZIP压缩**:对响应内容进行压缩,减少网络传输的数据量。 总结,JSP过滤器是Java Web开发中的重要工具,它允许我们在请求到达目标资源之前进行干预,实现各种定制化功能。通过实际项目练习,我们可以更好地...
在Java Web开发中,Filter(过滤器)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细介绍如何在Java中使用Filter过滤器,以及如何配置相关的配置文件,让你一目了然。 ### 1. Filter...
3. **性能优化**:缓存处理,比如对静态资源进行GZIP压缩,减少网络传输量。 4. **日志记录**:记录请求信息,便于分析系统行为和调试。 5. **过滤内容**:如去除HTML标签,防止XSS攻击。 6. **国际化和本地化**:...
6. **性能优化**: 过滤器还可以用于性能优化,如缓存控制、GZIP压缩等。通过在过滤器中实现这些功能,可以减少服务器负载,提高用户访问速度。 7. **部署与测试**: 自定义的URL过滤器需要正确地部署到Web应用服务器...
3. **GZIP压缩**:为了提高页面加载速度,过滤器可以检测客户端是否接受GZIP压缩,然后对响应内容进行压缩。 4. **日志记录**:过滤器可以拦截请求和响应,记录关键信息,帮助开发者调试和监控应用状态。 5. **缓存...
- **性能优化**:通过缓存策略、GZIP压缩等手段提高系统性能。 - **国际化和本地化**:监听器可以用来切换用户的语言环境。 - **数据转换**:过滤器可以自动转换请求参数格式,如将字符串转换为日期等。 在学习这两...
4. **全站GZIP压缩过滤器**:虽然实现起来较为复杂,但能显著减少传输的数据量,提高性能。 #### 巩固包装设计模式——装饰模式 1. **装饰模式的基本步骤**: - 定义一个接口,该接口定义了一组基本的操作。 - ...