【问题标题】:Aspectj: get Response body (HTML Text) from HttpServletRresponseAspectj:从 HttpServletRresponse 获取响应正文(HTML 文本)
【发布时间】:2013-08-05 19:31:01
【问题描述】:

我正在尝试使用 aspectJ 来拦截 HttpServlet.do*(request, response) 并获取 HTML 文本(需要提取标题并将 html 存储到文件中)。

一旦我引用了 HttpServletResponse,访问响应正文(html 文本)的最佳方式是什么?

这是我的凝视代码。

public aspect HttpRequestHandlerAspect {

pointcut getRequest(HttpServletRequest request, HttpServletResponse response) 
    : execution(protected * javax.servlet.http.HttpServlet.*(HttpServletRequest, HttpServletResponse))  
    && args(request, response);

  Object around(HttpServletRequest request, HttpServletResponse response) : getRequest(request, response) {
      Object ret = proceed(request, response);
              // now how do I access the HTML response text ( and get the title of the page) in here?

    }
}

【问题讨论】:

  • 为什么不为此使用过滤器。您不能直接从OutputStream 读取。

标签: java jakarta-ee servlets aop aspectj


【解决方案1】:

这可能不是您问题的准确答案,但请尝试按照此处的建议提取回复:How can I read an HttpServletReponses output stream? 您不必创建过滤器,只需传递给您的 HttpServletResponseWrapper

继续(请求,包装器)。

Object around(HttpServletRequest request, HttpServletResponse response): getRequest(request, response) {
    MyHttpServletResponseWrapper wrapper = new MyHttpServletResponseWrapper(response);
    Object ret = proceed(request, wrapper);
    // The MyHttpServletReponseWrapper class captures everything and doesn't forward to the original stream, so we have to do this
    response.getWriter().write(wrapper.toString());
    // use wrapper.toString() to access response
}

【讨论】:

  • 感谢您的回答,虽然这可以很好地获取 html 文本,但它不再向浏览器呈现响应。我想在没有用户感觉差异的情况下获得响应 HTML。
  • @Sammy:确实,包装器类返回它自己的PrintWriter,它不会将写入转发到包装响应的PrintWriter。我修改了我的答案,在调用proceed(request, wrapper) 之后写入整个捕获的数据,从而解决了这个问题。最好创建一个TeePrintWriter,比如this
  • @Sammy:您可以找到一个 CopyPrintWriter,它实际上会捕获写入,但也代表原始写入:stackoverflow.com/a/3242482/594406
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2017-08-23
相关资源
最近更新 更多