1)建立一个响应包装器。扩展javax.servlet.http.HttpServletResponseWrapper。 2)提供一个缓存输出的PrintWriter。重载getWriter方法,返回一个保存发送给它的所有东西的PrintWriter,并把结果存进一个可以稍后访问的字段中。 3)传递该包装器给doFilter。此调用是合法的,因为HttpServletResponseWrapper实现HttpServletResponse。 4)提取和修改输出。在调用FilterChain的doFilter方法后,原资源的输出只要利用步骤2中提供的机制就可以得到。只要对你的应用适合,就可以修改或替换它。 5)发送修改过的输出到客户机。因为原资源不再发送输出到客户机(这些输出已经存放到你的响应包装器中了),所以必须发送这些输出。这样,你的过滤器需要从原响应对象中获得PrintWriter或OutputStream,并传递修改过的输出到该流中。 (2).GZipFilter类 (3).GZipUtil类 (4).在web.xml中配置 GZipFilter |
下附HttpServletRequestWrapper、HttpServletResponseWrapper用法
class FilteredRequest extends HttpServletRequestWrapper
{
public FilteredRequest(ServletRequest request)
{
super((HttpServletRequest) request);
}
public String getParameter(String paramName)
{
String value = super.getParameter(paramName);
if ("myParameter".equals(paramName))
{
// 更改请求参数的值
value += "|127.0.0.1";
}
return value;
}
public String[] getParameterValues(String paramName)
{
String values[] = super.getParameterValues(paramName);
return values;
}
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class WrapperResponse extends HttpServletResponseWrapper
{
private MyPrintWriter tmpWriter;
private ByteArrayOutputStream output;
public WrapperResponse(ServletResponse httpServletResponse)
{
super((HttpServletResponse)httpServletResponse);
output = new ByteArrayOutputStream();
tmpWriter = new MyPrintWriter(output);
}
public void finalize() throws Throwable
{
super.finalize();
output.close();
tmpWriter.close();
}
public String getContent()
{
try
{
tmpWriter.flush(); //刷新该流的缓冲,详看java.io.Writer.flush()
String s = tmpWriter.getByteArrayOutputStream().toString("UTF-8");
//此处可根据需要进行对输出流以及Writer的重置操作
//比如tmpWriter.getByteArrayOutputStream().reset()
return s;
} catch (UnsupportedEncodingException e)
{
return "UnsupportedEncoding";
}
}
//覆盖getWriter()方法,使用我们自己定义的Writer
public PrintWriter getWriter() throws IOException
{
return tmpWriter;
}
public void close() throws IOException
{
tmpWriter.close();
}
//自定义PrintWriter,为的是把response流写到自己指定的输入流当中
//而非默认的ServletOutputStream
private static class MyPrintWriter extends PrintWriter
{
ByteArrayOutputStream myOutput; //此即为存放response输入流的对象
public MyPrintWriter(ByteArrayOutputStream output)
{
super(output);
myOutput = output;
}
public ByteArrayOutputStream getByteArrayOutputStream()
{
return myOutput;
}
}
}
调用处
FilteredRequest filterRequest = new FilteredRequest(request);
WrapperResponse filterResponse = new WrapperResponse(response);
filterChain.doFilter(filterRequest, filterResponse);
String content = filterResponse.getContent();
- /覆盖getWriter()方法,使用我们自己定义的Writer
-
public PrintWriter getWriter() throws IOException