2016-10-31 10 views
0

SQL Serverデータベースにアクセスデータ(remoteHost、userName、virtualHost、メソッド(post/get)、クエリ、リファラー)を記録しているserver.xmlに設定があります(JDBCAccessLogValveを使用して)。それは大丈夫ですが、私はHTTP POSTの内容を記録する必要があり、それをやる方法はわかりません。JDBCAccessLogValue - SQL ServerにHTTP POSTコンテンツを記録する

これを行うことができるJDBCAccessLogValveの設定はありますか?

フィルタについても読んでいますが、実際にどのように実装するかわかりません。 何か助けや助言を歓迎します。

答えて

0

私は最終的にフィルターを作ることを終え、それは働いています。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 

    boolean dangerRequest = false; 

    try { 
     // TODO: 0. Verify if access_log is enable to this VM 

     // TODO: 1. Validate content length 
     if (request.getContentLength() > -1) { 
      int i = 0; 
      i++; 
     } 

     Date timestamp = new Date(); 
     String virtualHost = httpRequest.getServerName(); 
     String method = httpRequest.getMethod(); 
     String referer = httpRequest.getHeader("referer"); 
     String userAgent = httpRequest.getHeader("user-agent"); 

     StringBuilder url = new StringBuilder(); 
     StringBuffer urlBuffer = httpRequest.getRequestURL(); 
     if (urlBuffer != null) { 
      url.append(urlBuffer.toString()); 
     } 

     String queryString = httpRequest.getQueryString(); 
     if (!TextTools.isNullOrEmpty(queryString)) { 
      url.append("?"); 
      url.append(queryString); 
     } 

     String remoteHost = request.getRemoteAddr(); 

     StringBuilder headers = new StringBuilder(); 
     Enumeration<String> allHeaders = httpRequest.getHeaderNames(); 
     // If the servlet container does not allow servlets to use this method >> NULL 
     if (allHeaders != null) { 
      while (allHeaders.hasMoreElements()) { 
       if (headers.length() > 0) { 
        headers.append("; "); 
       } 
       headers.append(allHeaders.nextElement()); 
      } 
     } 

     StringBuilder params = new StringBuilder(); 
     Enumeration<String> paramasEnum = request.getParameterNames(); 
     while (paramasEnum.hasMoreElements()) { 
      String name = paramasEnum.nextElement(); 
      params.append(name); 
      params.append("="); 
      String value = request.getParameter(name); 

      if (value.contains("'")) { 
       dangerRequest = true; 
      } 

      params.append(value); 
      if (paramasEnum.hasMoreElements()) { 
       params.append("\r\n"); 
      } 
     } 

     Integer contentLength = request.getContentLength(); 

     Connection conn = null; 

     try { 
      conn = Server.get().getConn(true); 

      accessLog accessLog = new accessLog(); 
      accessLog.setTimestamp(timestamp); 
      if (virtualHost.length() > 64) { 
       accessLog.setVirtualHost(virtualHost.substring(0, 64)); 
      } else { 
       accessLog.setVirtualHost(virtualHost); 
      } 
      if (method.length() > 8) { 
       accessLog.setMethod(method.substring(0, 8)); 
      } else { 
       accessLog.setMethod(method); 
      } 
      if (referer.length() > 128) { 
       accessLog.setReferer(referer.substring(0, 128)); 
      } else { 
       accessLog.setReferer(referer); 
      } 
      if (userAgent.length() > 128) { 
       accessLog.setUserAgent(userAgent.substring(0, 128)); 
      } else { 
       accessLog.setUserAgent(userAgent); 
      } 
      if (url.toString().length() > 255) { 
       accessLog.setUrl(url.toString().substring(0, 255)); 
      } else { 
       accessLog.setUrl(url.toString()); 
      } 
      if (remoteHost.length() > 15) { 
       accessLog.setRemoteHost(remoteHost.substring(0, 15)); 
      } else { 
       accessLog.setRemoteHost(remoteHost); 
      } 
      if (headers.toString().length() > 255) { 
       accessLog.setHeaders(headers.toString().substring(0, 255)); 
      } else { 
       accessLog.setHeaders(headers.toString()); 
      } 
      if (params.toString().length() > 255) { 
       accessLog.setParams(params.toString().substring(0, 255)); 
      } else { 
       accessLog.setParams(params.toString()); 
      } 
      accessLog.setContentLength(contentLength); 

      accessLogDao dao = new accessLogDao(conn, null); 
      dao.saveRow(accessLog); 
      conn.commit(); 

     } catch (Exception e) { 
      Server.get().getLogger().error(e); 
      conn.rollback(); 
     } finally { 
      if (conn != null) { 
       conn.close(); 
      } 
     } 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 

    // TODO: 2. Validate patterns 
    if (!dangerRequest) { 
     super.doFilter(request, response, chain); 
    } 
} 
関連する問題