Discuss / Java / 再回头看这些感觉内部好复杂。

再回头看这些感觉内部好复杂。

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]

1.将包装后的response传递给下游组件后   chain.doFilter(request, wrapper);

2.在下游组件,HelloServlet中执行这段代码时, 

        PrintWriter pw = resp.getWriter();
        pw.write("<h1>Hello, world!</h1>");
        pw.flush();

实际是将数据写入到了包装类CachedHttpServletResponse中的ByteArrayOutputStream

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

    3.然后从包装类中取出数据,写入缓存,并刷新给客户端。

   ......
   data = wrapper.getContent();
   cache.put(url, data);
   ......
   // 写入到原始的Response:
   ServletOutputStream output = resp.getOutputStream();
   output.write(data);
   output.flush();

其实最重要的点就是这里。下游组件flush的时候并没有发送数据给客户端,而是走response的包装类,把数据存起来了。

        PrintWriter pw = resp.getWriter();
        pw.write("<h1>Hello, world!</h1>");
        pw.flush();

  • 1

Reply