java - 使用 Servlet Filter 记录请求和响应

标签 java servlets httprequest httpresponse servlet-filters

我正在研究开发一个 servlet/过滤器以在 Web 应用程序中使用,过滤器必须记录 Web 应用程序的所有用户在网站上的每个请求。 在我看来,过滤器必须以这种方式工作

过滤->请求->保存请求->do.chain

public class ServletFilter implements Filter {
  private Application fApp;
 StringWriter ResponseRECORDER; 
 StringWriter RequestRECORDER;
  @Override
  public void init(FilterConfig config) throws ServletException {
    fApp = (Application)config.getServletContext().getAttribute("application");
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {

    chain.doFilter(request,response);
    // Ignore non-http requests.
    if (!(request instanceof HttpServletRequest))
    {
        chain.doFilter(request,response);
        return;
    }

    ((HttpServletRequest)request).getSession();


    // Write the request out to the recording file.
    recordReqResHTTP((HttpServletRequest) request,
            (HttpServletResponse) response); 
    StringBuilder Fixed = new StringBuilder();
    Fixed.append("[Message]");
    Fixed.append("[time]");  
    Fixed.append(System.currentTimeMillis());
    Fixed.append("[/time]");
    Fixed.append("[Request]");
    Fixed.append(RequestRECORDER);
    Fixed.append("[/Request]");
    Fixed.append("[Response]");
    Fixed.append(ResponseRECORDER);
    Fixed.append("[/Response]");
    Fixed.append("[/Message]");

    MessagingService s = (MessagingService)fApp
        .getService("it.interprise.core.workflow.MessagingService");    
    try {
      s.send("recorder", Fixed.toString());
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  @Override
  public void destroy() {
  }

  public void recordReqResHTTP(HttpServletRequest request,
     HttpServletResponse response)
{
  //HttpSession session = request.getSession();

  //costruisco una stringa per la raccolta dati
  StringWriter ResponseRECORDER = new StringWriter();  
  StringWriter RequestRECORDER = new StringWriter();

  try
  {

    //Registro la Request 

      PrintWriter out = new PrintWriter(RequestRECORDER);
      out.println("<request>");
      out.print("<uri>");
      out.print(request.getRequestURI());
      out.println("</uri>");
      Enumeration e = request.getParameterNames();
      while (e.hasMoreElements())
      {
          String paramName = (String) e.nextElement();
          String[] values = request.getParameterValues(paramName);
          for (int i=0; i < values.length; i++)
          {
              out.print("<param><name>");
              out.print(paramName);
              out.print("</name><value>");
              out.print(values[i]);
              out.println("</value></param>");
          }
      }
      out.println("</request>");
      out.close();
    //Registro la Response

      PrintWriter res = new PrintWriter(ResponseRECORDER);
      res.println("<request>");
      res.print("<uri>");
      res.print(request.getRequestURI());
      res.println("</uri>");
      Enumeration f = request.getParameterNames();
      while (f.hasMoreElements())
      {
          String paramName = (String) f.nextElement();
          String[] values = request.getParameterValues(paramName);
          for (int i=0; i < values.length; i++)
          {
              res.print("<param><name>");
              res.print(paramName);
              res.print("</name><value>");
              res.print(values[i]);
              res.println("</value></param>");
          }
      }
      out.println("</request>");
      out.close();
  }

  catch (Exception exc)
  {

  }
}
}

同样的回复,你知道我该如何解决这个问题吗? 使用此过滤器,Web 应用程序停止响应...

谢谢

最佳答案

您应该做的第一件事是至少在示例底部记录异常。也许出现了无法通过检查代码来识别的异常

两次关闭 PrintWriter 之前的几行,这可能会导致 IOException

第二:声明实例变量 ResponseRECORDERRequestRECORDER,但稍后声明两个同名的局部变量。删除实例变量 - 过滤器 必须实现线程安全。

完成后,我猜我们会看到一个隐藏的NullPointer

关于java - 使用 Servlet Filter 记录请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11722409/

相关文章:

php - 通过 Android 应用上传图片并使用 $_POST 发送文本

swift - HTTP 请求 PUT 文件(图像)到 Swift RESTful API (Grails)

java - 如何生成、导出为word docx文件?

javascript - Popup Modal 的动态填充

java - 使用PrintWriter编写新的HTML时出错

servlets - 在 Jetty 关闭连接之前优雅地停止 servlet

java - 从套接字读取时如何检测客户端何时完成发送请求?

Java-使用compareTo()方法手动对字符串数组进行排序

java - 与特定浏览器通信

java - Fitnesse 的代码覆盖率