2012-07-30 53 views
0

我是研究發展Deng一個servlet /過濾器在Web應用程序中使用,過濾器必須記錄由Web應用程序的所有用戶在網站上每一個要求。 在我的頭上的過濾器具有這樣記錄請求和響應與Servlet過濾器

過濾器的工作 - >請求 - >保存請求 - > 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應用程序停止響應...

謝謝

回答

1

你應該做的第一件事就是日誌Exception在你的榜樣的底部,至少。也許有一個Exception提出,不能通過檢查代碼來識別。

你前幾行關閉PrintWriter兩次,這可能會導致IOException

第二種:聲明實例變量ResponseRECORDERRequestRECORDER,但後來聲明兩個同名的本地變量。刪除實例變量 - filter必須實現線程安全。

一旦這樣做,我會想我們將看到一個隱藏NullPointer

+0

謝謝你,我試圖解決這個問題,很抱歉,是我與過濾firt工作,我嘗試修復像你說的! – Smalltree1989 2012-07-30 16:19:08

相關問題