标签:架构 log 为什么 共享 private 覆盖 大致 one utf-8
转载自:http://blog.csdn.net/it_man/article/details/7556903
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 |
1 class FilteredRequest extends HttpServletRequestWrapper 2 { 3 4 public FilteredRequest(ServletRequest request) 5 { 6 super((HttpServletRequest) request); 7 } 8 9 public String getParameter(String paramName) 10 { 11 String value = super.getParameter(paramName); 12 if ("myParameter".equals(paramName)) 13 { 14 // 更改请求参数的值 15 value += "|127.0.0.1"; 16 } 17 return value; 18 } 19 20 public String[] getParameterValues(String paramName) 21 { 22 String values[] = super.getParameterValues(paramName); 23 return values; 24 } 25 }
1 import java.io.ByteArrayOutputStream; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 import java.io.UnsupportedEncodingException; 5 6 import javax.servlet.ServletResponse; 7 import javax.servlet.http.HttpServletResponse; 8 import javax.servlet.http.HttpServletResponseWrapper; 9 10 public class WrapperResponse extends HttpServletResponseWrapper 11 { 12 private MyPrintWriter tmpWriter; 13 14 private ByteArrayOutputStream output; 15 16 public WrapperResponse(ServletResponse httpServletResponse) 17 { 18 super((HttpServletResponse)httpServletResponse); 19 output = new ByteArrayOutputStream(); 20 tmpWriter = new MyPrintWriter(output); 21 } 22 23 public void finalize() throws Throwable 24 { 25 super.finalize(); 26 output.close(); 27 tmpWriter.close(); 28 } 29 30 public String getContent() 31 { 32 try 33 { 34 tmpWriter.flush(); //刷新该流的缓冲,详看java.io.Writer.flush() 35 String s = tmpWriter.getByteArrayOutputStream().toString("UTF-8"); 36 //此处可根据需要进行对输出流以及Writer的重置操作 37 //比如tmpWriter.getByteArrayOutputStream().reset() 38 return s; 39 } catch (UnsupportedEncodingException e) 40 { 41 return "UnsupportedEncoding"; 42 } 43 } 44 45 //覆盖getWriter()方法,使用我们自己定义的Writer 46 public PrintWriter getWriter() throws IOException 47 { 48 return tmpWriter; 49 } 50 51 public void close() throws IOException 52 { 53 tmpWriter.close(); 54 } 55 56 //自定义PrintWriter,为的是把response流写到自己指定的输入流当中 57 //而非默认的ServletOutputStream 58 private static class MyPrintWriter extends PrintWriter 59 { 60 ByteArrayOutputStream myOutput; //此即为存放response输入流的对象 61 62 public MyPrintWriter(ByteArrayOutputStream output) 63 { 64 super(output); 65 myOutput = output; 66 } 67 68 public ByteArrayOutputStream getByteArrayOutputStream() 69 { 70 return myOutput; 71 } 72 } 73 }
调用处
1 FilteredRequest filterRequest = new FilteredRequest(request); 2 WrapperResponse filterResponse = new WrapperResponse(response); 3 filterChain.doFilter(filterRequest, filterResponse); 4 String content = filterResponse.getContent();
1 //覆盖getWriter()方法,使用我们自己定义的Writer 2 public PrintWriter getWriter() throws IOException
HettpServletResponseWrapper吧
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,HttpSessionWrapper用法
标签:架构 log 为什么 共享 private 覆盖 大致 one utf-8
原文地址:http://www.cnblogs.com/cvcn/p/7677149.html