`
isiqi
  • 浏览: 16548033 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

通过Filter和HttpServletResponseWrapper,实现Gzip压缩

 
阅读更多

实现定制输出的关键是对HttpServletResponse进行包装,截获所有输出,等过滤器链处理完后,
Filter.doFilter,在截获输出进行处理,在写入到真正的HttpServletResponse中。J2EE中已有
HttpServletResponseWrapper,使得包装HttpServletResponse更加容易

public class GZipFilter implements Filter {
public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
Wrapper wrapper = new Wrapper(resp);
chain.doFilter(request, wrapper);
byte[] gzipData = gzip(wrapper.getResponseData());
resp.addHeader("Content-Encoding", "gzip");
resp.setContentLength(gzipData.length);
ServletOutputStream output = response.getOutputStream();
output.write(gzipData);
output.flush();
}

private byte[] gzip(byte[] data) {
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240);
GZIPOutputStream output = null;
try {
output = new GZIPOutputStream(byteOutput);
output.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (output != null) {
try {
output.close();
} catch (IOException e) {
}
}
}
return byteOutput.toByteArray();
}

public void init(FilterConfig fConfig) throws ServletException {
}
}


类Wrapper:
public class Wrapper extends HttpServletResponseWrapper {
public static final int OT_NONE = 0, OT_WRITER = 1, OT_STREAM = 2;
private int outputType = OT_NONE;
private ServletOutputStream output = null;
private PrintWriter writer = null;
private ByteArrayOutputStream buffer = null;

public Wrapper(HttpServletResponse resp) throws IOException {
super(resp);
buffer = new ByteArrayOutputStream();
}

public PrintWriter getWriter() throws IOException {
if (outputType == OT_STREAM)
throw new IllegalStateException();
else if (outputType == OT_WRITER)
return writer;
else {
outputType = OT_WRITER;
writer = new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding()));
return writer;
}
}

public ServletOutputStream getOutputStream() throws IOException {
if (outputType == OT_WRITER)
throw new IllegalStateException();
else if (outputType == OT_STREAM)
return output;
else {
outputType = OT_STREAM;
output = new WrappedOutputStream(buffer);
return output;
}
}

public void flushBuffer() throws IOException {
if (outputType == OT_WRITER)
writer.flush();
if (outputType == OT_STREAM)
output.flush();
}

public void reset() {
outputType = OT_NONE;
buffer.reset();
}

public byte[] getResponseData() throws IOException {
flushBuffer();
return buffer.toByteArray();
}

//内部类,扩展ServletOutputStream
class WrappedOutputStream extends ServletOutputStream {
private ByteArrayOutputStream buffer;

public WrappedOutputStream(ByteArrayOutputStream buffer) {
this.buffer = buffer;
}

public void write(int b) throws IOException {
buffer.write(b);
}

public byte[] toByteArray() {
return buffer.toByteArray();
}
}
}
分享到:
评论

相关推荐

    使用Filter和HttpServletResponseWrapper进行页面缓存

    源代码 博文链接:https://msj.iteye.com/blog/179663

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

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

    java filter打印请求返回参数

    通过以上步骤,我们可以实现在Java Web应用中通过Filter来打印请求和响应的数据。这种方法不仅能够帮助我们更好地理解和调试程序逻辑,还能为后续的日志记录和性能分析提供有用的信息。此外,通过对请求和响应的封装...

    serlvet 的过滤器实现缓存机制

    Servlet过滤器是Java Web开发中的一个重要组件,它允许在Servlet处理请求之前或之后对请求和响应进行拦截...通过合理的缓存策略和适当的配置,我们可以利用过滤器实现高效的数据缓存,降低服务器的负担,提高用户体验。

    STRUTS:filter过滤器

    ### STRUTS:filter过滤器 #### 概述 在Java Web开发中,过滤器(Filter)是一种重要的组件,用于拦截客户端发送至服务器的请求或...理解过滤器的基本原理和实现机制对于开发高质量的Java Web应用程序至关重要。

    解决JSP字符串乱码的过滤器

    本教程将详细介绍如何通过实现一个过滤器(Filter)来解决JSP页面中的字符串乱码问题。 首先,我们需要理解字符编码的基础知识。字符编码是用来表示文本的一套规则,常见的有ASCII、GBK、UTF-8等。在Web应用中,...

    jsp实现将动态网页转换成静态页面的方法.docx

    本篇文章将深入探讨如何通过JSP(Java Server Pages)技术实现这一目标,并详细分析其原理及具体实现步骤。 #### JSP简介 JSP是一种基于Java的服务器端脚本技术,用于创建动态网页。它允许开发者在HTML文档中嵌入...

    使用filter实现url级别内存缓存示例

    在本文中,我们将深入探讨如何使用filter实现URL级别的内存缓存,这有助于提高Web应用程序的性能,特别是对于那些经常被请求但数据变化不频繁的URL。我们主要关注以下几个关键点:缓存策略、缓存配置、自定义响应...

    sping MVC 简单小例子

    总结,这个"Spring MVC 简单小例子"旨在展示如何通过Spring MVC实现基础的HTTP处理,结合自定义Filter进行请求和响应的拦截,以及自定义ServletResponse以扩展响应功能。这些基础知识对于理解Spring MVC的工作原理...

    利用spring security 给cxf的业务方法添加保护

    这个过滤器应该实现`Filter`接口,并在`doFilter`方法中调用`HttpServletRequestWrapper`和`ServletResponseWrapper`,以便Spring Security可以检查请求的合法性。 ```java public class SpringSecurityCxfFilter ...

    9.设计模式-装饰器模式1

    1. **Servlet API**:在 Java Web 开发中,`HttpServletRequestWrapper` 和 `HttpServletResponseWrapper` 就是典型的装饰器模式应用,它们允许开发者在原始请求和响应对象的基础上添加额外的功能,如日志记录、安全...

    java过滤器中修改一个http请求的返回内容.pdf

    总结起来,Java过滤器通过HttpServletResponseWrapper和自定义的输出流包装类,可以在HTTP响应被发送到客户端之前对其进行修改,这在需要动态调整响应内容、添加额外信息或者实现其他自定义逻辑的场景下非常有用。...

    java过滤器中修改一个http请求的返回内容.docx

    在Java Web开发中,过滤器(Filter)是一个强大的工具,它可以拦截HTTP请求和响应,进行预处理或后处理。在给定的文档中,我们关注的是如何在过滤器中修改HTTP响应的内容。以下是对这个主题的详细解释: 1. **...

    语言技术语言技术语言技术

    测试Filter时,你可以访问由Container管理的`HttpServletRequestWrapper`、`HttpServletResponseWrapper`、`FilterConfigWrapper`和`FilterChain`对象。对于JSP测试,`JspTestCase`允许直接使用JSP的隐含对象进行...

    spring-session简介及实现原理源码分析

    2. 继承 HttpServletRequestWrapper 和 HttpServletResponseWrapper,重写 getSession 等相关方法 3. 在 doFilter 中,new 自定义的 Request 和 Response 的类,并把它们分别传递到过滤器链中 4. 把该 Filter 配置到...

    scwcd考试中常用的API

    - **abstract class: GenericServlet**:这是一个抽象类,实现了Servlet和ServletConfig接口,简化了Servlet的实现。 #### javax.servlet.http - **class: HttpServlet**:这是处理HTTP请求的基类,继承自...

    springsecurity-thymeleaf.zip

    1. **Filter Chain**: Spring Security 使用一系列过滤器来处理请求,如`HttpServletRequestWrapper` 和 `HttpServletResponseWrapper`,这些过滤器负责身份验证、授权和其他安全操作。 2. **Authentication ...

    servlet与jsp中文乱码处理

    - **创建Filter**:定义一个实现了`javax.servlet.Filter`接口的类,并重写`doFilter`方法。 - **配置Filter**:在web.xml中配置过滤器,指定需要拦截的URL模式。 - **处理乱码**:在`doFilter`方法中,对请求和...

Global site tag (gtag.js) - Google Analytics