如果请求是幂等的(例如
GET请求),则仅用于
java.net.URL获取JSP输出的InputStream。例如
InputStream input = new URL("http://localhost/context/page.jsp").openStream();如果请求不是幂等的(例如
POST请求),那么您需要创建一个
Filter,其中包含的
ServletResponse自定义实现,其中
PrintWriter包含
write()被覆盖的五个方法,其中将输出复制到存储在会话中的某个缓冲区/构建器中,本地磁盘文件系统上的一个临时文件夹,以便以后可以在后续请求中对其进行访问。例如
package mypackage;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.Writer;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class CopyResponseFilter implements Filter { public void init(FilterConfig config) throws ServletException { // NOOP. } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Set character encoding for better world domination. response.setCharacterEncoding("UTF-8"); // Create copy writer. HttpServletResponse httpResponse = (HttpServletResponse) response; CopyWriter copyWriter = new CopyWriter(new OutputStreamWriter( httpResponse.getOutputStream(), httpResponse.getCharacterEncoding())); // Filter request with response which is wrapped with new writer. chain.doFilter(request, wrapResponse(httpResponse, copyWriter)); // Store the copy writer afterwards in session so that it's available in next request. HttpServletRequest httpRequest = (HttpServletRequest) request; httpRequest.getSession().setAttribute("copyWriter", copyWriter); } public void destroy() { // NOOP. } private static HttpServletResponse wrapResponse (final HttpServletResponse response, final PrintWriter writer) { return new HttpServletResponseWrapper(response) { public PrintWriter getWriter() throws IOException { return writer; } }; }}class CopyWriter extends PrintWriter { StringBuilder copy = new StringBuilder(); public CopyWriter(Writer out) { super(out); } public void write(int c) { copy.append((char) c); // It is actually a char, not an int. super.write(c); super.flush(); } public void write(char[] chars) { copy.append(chars); super.write(chars); super.flush(); } public void write(char[] chars, int offset, int length) { copy.append(chars, offset, length); super.write(chars, offset, length); super.flush(); } public void write(String string) { copy.append(string); super.write(string); super.flush(); } public void write(String string, int offset, int length) { copy.append(string, offset, length); super.write(string, offset, length); super.flush(); } public String getCopy() { return copy.toString(); }}您可以通过在会话中访问来访问后续请求的任何servlet中的最终输出(请注意,您 不能 在 当前
请求的任何servlet中访问它,因为为时已晚,无法对其进行任何处理)
CopyWriter:
CopyWriter copyWriter = (CopyWriter) request.getSession().getAttribute("copyWriter");String outputOfPreviousRequest = copyWriter.getCopy();请注意,您应该将此过滤器映射
url-pattern到感兴趣的JSP页面上,而不要
/*这样,否则它将在同一JSP中包含的静态文件(css,js,图像等)上运行。
还要注意,同一会话内的多个请求将相互覆盖,这取决于您是通过使用适当的方式
url-pattern还是另一种方式将其存储在会话中来区分这些请求,例如,使用a
Map<URL, CopyWriter>左右的方式。
希望这可以帮助。



