0

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 アプリケーションの停止応答が...

ありがとうございました

4

1 に答える 1

1

最初にすべきことは、少なくとも例の最後にログを記録することです。コードを調べても特定できない隆起がある可能性がありますExceptionException

Twice を閉じる数行前にPrintWriterIOException.

2 番目: インスタンス変数ResponseRECORDERと を宣言しますRequestRECORDERが、後で同じ名前の 2 つのローカル変数を宣言します。インスタンス変数を削除します -filterスレッドセーフに実装する必要があります。

完了すると、 hidden が表示されると思いますNullPointer

于 2012-07-30T13:33:41.140 に答える