2016-10-31 6 views
0

SQL Server 데이터베이스에 일부 액세스 데이터 (remoteHost, userName, virtualHost, 메소드 (게시/가져 오기), 쿼리, 리퍼러)를 로깅하는 server.xml 구성이 있습니다. (JDBCAccessLogValve 포함). 모든 일을하고 있지만 HTTP POST의 내용을 기록해야하는데 어떻게해야할지 모르겠다.JDBCAccessLogValue - HTTP POST 내용을 SQL Server에 기록하십시오.

누가 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); 
    } 
}