实现定制输出的关键是对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 {
}
}
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();
}
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();
}
}
}
分享到:
相关推荐
源代码 博文链接:https://msj.iteye.com/blog/179663
本文将详细介绍如何使用Gzip来打包JS和CSS文件,并在Java后台通过Filter实现解压缩。 首先,我们需要了解Gzip的工作原理。Gzip基于DEFLATE算法,该算法结合了LZ77(一种无损数据压缩算法)和霍夫曼编码。它通过查找...
通过以上步骤,我们可以实现在Java Web应用中通过Filter来打印请求和响应的数据。这种方法不仅能够帮助我们更好地理解和调试程序逻辑,还能为后续的日志记录和性能分析提供有用的信息。此外,通过对请求和响应的封装...
Servlet过滤器是Java Web开发中的一个重要组件,它允许在Servlet处理请求之前或之后对请求和响应进行拦截...通过合理的缓存策略和适当的配置,我们可以利用过滤器实现高效的数据缓存,降低服务器的负担,提高用户体验。
### STRUTS:filter过滤器 #### 概述 在Java Web开发中,过滤器(Filter)是一种重要的组件,用于拦截客户端发送至服务器的请求或...理解过滤器的基本原理和实现机制对于开发高质量的Java Web应用程序至关重要。
本教程将详细介绍如何通过实现一个过滤器(Filter)来解决JSP页面中的字符串乱码问题。 首先,我们需要理解字符编码的基础知识。字符编码是用来表示文本的一套规则,常见的有ASCII、GBK、UTF-8等。在Web应用中,...
本篇文章将深入探讨如何通过JSP(Java Server Pages)技术实现这一目标,并详细分析其原理及具体实现步骤。 #### JSP简介 JSP是一种基于Java的服务器端脚本技术,用于创建动态网页。它允许开发者在HTML文档中嵌入...
在本文中,我们将深入探讨如何使用filter实现URL级别的内存缓存,这有助于提高Web应用程序的性能,特别是对于那些经常被请求但数据变化不频繁的URL。我们主要关注以下几个关键点:缓存策略、缓存配置、自定义响应...
总结,这个"Spring MVC 简单小例子"旨在展示如何通过Spring MVC实现基础的HTTP处理,结合自定义Filter进行请求和响应的拦截,以及自定义ServletResponse以扩展响应功能。这些基础知识对于理解Spring MVC的工作原理...
这个过滤器应该实现`Filter`接口,并在`doFilter`方法中调用`HttpServletRequestWrapper`和`ServletResponseWrapper`,以便Spring Security可以检查请求的合法性。 ```java public class SpringSecurityCxfFilter ...
1. **Servlet API**:在 Java Web 开发中,`HttpServletRequestWrapper` 和 `HttpServletResponseWrapper` 就是典型的装饰器模式应用,它们允许开发者在原始请求和响应对象的基础上添加额外的功能,如日志记录、安全...
总结起来,Java过滤器通过HttpServletResponseWrapper和自定义的输出流包装类,可以在HTTP响应被发送到客户端之前对其进行修改,这在需要动态调整响应内容、添加额外信息或者实现其他自定义逻辑的场景下非常有用。...
在Java Web开发中,过滤器(Filter)是一个强大的工具,它可以拦截HTTP请求和响应,进行预处理或后处理。在给定的文档中,我们关注的是如何在过滤器中修改HTTP响应的内容。以下是对这个主题的详细解释: 1. **...
测试Filter时,你可以访问由Container管理的`HttpServletRequestWrapper`、`HttpServletResponseWrapper`、`FilterConfigWrapper`和`FilterChain`对象。对于JSP测试,`JspTestCase`允许直接使用JSP的隐含对象进行...
2. 继承 HttpServletRequestWrapper 和 HttpServletResponseWrapper,重写 getSession 等相关方法 3. 在 doFilter 中,new 自定义的 Request 和 Response 的类,并把它们分别传递到过滤器链中 4. 把该 Filter 配置到...
- **abstract class: GenericServlet**:这是一个抽象类,实现了Servlet和ServletConfig接口,简化了Servlet的实现。 #### javax.servlet.http - **class: HttpServlet**:这是处理HTTP请求的基类,继承自...
1. **Filter Chain**: Spring Security 使用一系列过滤器来处理请求,如`HttpServletRequestWrapper` 和 `HttpServletResponseWrapper`,这些过滤器负责身份验证、授权和其他安全操作。 2. **Authentication ...
- **创建Filter**:定义一个实现了`javax.servlet.Filter`接口的类,并重写`doFilter`方法。 - **配置Filter**:在web.xml中配置过滤器,指定需要拦截的URL模式。 - **处理乱码**:在`doFilter`方法中,对请求和...