栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在服务器端捕获生成的动态内容

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在服务器端捕获生成的动态内容

如果请求是幂等的(例如

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>
左右的方式。

希望这可以帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/417242.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号