Quellcode durchsuchen

쿼리로그작업중

huiwonseo vor 4 Jahren
Ursprung
Commit
137ac51f02

+ 11 - 0
src/main/java/com/lemon/lifecenter/common/LifeCenterFunction.java

@@ -250,6 +250,17 @@ public class LifeCenterFunction {
       return "";
     }
     
+    public static String getFullURL(HttpServletRequest request) {
+        StringBuilder requestURL = new StringBuilder(request.getRequestURL().toString());
+        String queryString = request.getQueryString();
+
+        if (queryString == null) {
+            return requestURL.toString();
+        } else {
+            return requestURL.append('?').append(queryString).toString();
+        }
+    }
+    
     public static String changeJuminToBirthday(String dateStr) {
         String resDate = "";
         try {

+ 2 - 0
src/main/java/com/lemon/lifecenter/common/LifeCenterInterCeptor.java

@@ -1,6 +1,7 @@
 package com.lemon.lifecenter.common;
 
 import java.io.IOException;
+import java.lang.reflect.Method;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -9,6 +10,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 

+ 195 - 0
src/main/java/com/lemon/lifecenter/common/LifeCenterQueryLog.java

@@ -0,0 +1,195 @@
+package com.lemon.lifecenter.common;
+import java.lang.reflect.Field;
+import java.sql.Statement;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Plugin;
+import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.session.ResultHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.lemon.lifecenter.dto.QueryLogDTO;
+import com.lemon.lifecenter.service.QueryLogService;
+
+/*
+   @Intercepts(@Signature(
+            type=Executor.class,
+            method="query",
+            args= {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
+
+*/
+@Intercepts({ @Signature(type = StatementHandler.class, method = "update", args = { Statement.class }),
+        @Signature(type = StatementHandler.class, method = "query", args = { Statement.class, ResultHandler.class }) })
+public class LifeCenterQueryLog implements Interceptor {
+
+    @Autowired
+    private QueryLogService queryLogService;
+    
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        String method = invocation.getMethod().getName();
+        
+        StatementHandler handler = (StatementHandler) invocation.getTarget();
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest();
+
+        String sql = bindSql(handler); // SQL 추출
+        String param = handler.getParameterHandler().getParameterObject()!=null ?
+                handler.getParameterHandler().getParameterObject().toString() : "";
+        
+        Object session = request.getSession().getAttribute( "sesId" );
+//        String url  = request.getRequestURI().toString();
+//        String port = String.valueOf(request.getServerPort());
+//        Object groupIdx = request.getSession().getAttribute( "sesGroupIdx" );
+//        Object sesMId   = request.getSession().getAttribute( "sesMId" );
+//        Object sesPasswordChange = request.getSession().getAttribute( "sesPasswordChange" );
+//        Object sesAcceptCheck = request.getSession().getAttribute( "sesAcceptCheck" );
+//        Object sesPermissions = request.getSession().getAttribute( "sesPermissions" );
+        System.err.println( param );
+        if( sql.contains( "-- insertSysQueryLog" ) ) {
+            System.err.println( param );
+        }
+        if( session != null ) {
+            if( !param.contains( "com.lemon.lifecenter.dto.LoginDTO" ) ) {
+                if( !sql.contains( "-- selectNowPathRoleCheckTotal" ) &&
+                        !sql.contains( "-- selectNowPathRoleCheckData" ) && 
+                        !sql.contains( "-- insertMenuAccessLog" ) &&
+                        !sql.contains( "-- selectSideMenuList" ) && 
+                        !sql.contains( "-- insertSysQueryLog" ) ) {
+                    
+//                    System.err.println("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
+//                    System.err.println(sql);
+//                    System.err.println("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
+                    
+                    
+                    QueryLogDTO dto = new QueryLogDTO();
+                    
+                    System.err.println( session.toString() );
+                    System.err.println( LifeCenterFunction.getRemoteAddr( request )  );
+                    System.err.println( LifeCenterFunction.getFullURL( request ) );
+                    
+                    
+                    dto.setId( session.toString() );
+                    dto.setIp( LifeCenterFunction.getRemoteAddr( request ) );
+                    dto.setQueryLog( sql );
+                    dto.setFullUrl( LifeCenterFunction.getFullURL( request ) );
+                    
+                    queryLogService.insertSysQueryLog(dto);
+                }
+            }
+        }
+        
+//        if ( url.contains( "/error" ) || url.contains( "/nonface/wait" ) || url.contains( "/mobile/call" ) ||
+//             url.contains( "/store" ) || url.contains( "/favicon.ico" )  || url.contains( "/mobile/getAppVersion" ) ||
+//             url.contains("/lifeCenter/api") || url.contains( "/accept/public" ) ) {
+//            
+//        } else if( url.contains( "/mobile" ) ) {
+//            
+//        } else {
+//            
+//            if( !url.equals( "/login/staff" ) && !url.equals( "/login/admin" ) ) {
+//                if( session == null ) {
+//                    
+//                }
+//            }
+//            
+//        }
+        
+        return invocation.proceed();
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+    }
+
+    /**
+     * <pre>
+     * bindSql
+     *
+     * <pre>
+     *
+     * @param boundSql
+     * @param sql
+     * @param param
+     * @return
+     * @throws NoSuchFieldException
+     * @throws IllegalAccessException
+     */
+    @SuppressWarnings("rawtypes")
+    private String bindSql(StatementHandler handler) throws NoSuchFieldException, IllegalAccessException {
+        BoundSql boundSql = handler.getBoundSql();
+
+        // 쿼리실행시 맵핑되는 파라미터를 구한다
+        Object param = handler.getParameterHandler().getParameterObject();
+        // 쿼리문을 가져온다(이 상태에서의 쿼리는 값이 들어갈 부분에 ?가 있다)
+        String sql = boundSql.getSql();
+
+        // 바인딩 파라미터가 없으면
+        if (param == null) {
+            sql = sql.replaceFirst("\\?", "''");
+            return sql;
+        }
+
+        // 해당 파라미터의 클래스가 Integer, Long, Float, Double 클래스일 경우
+        if (param instanceof Integer || param instanceof Long || param instanceof Float || param instanceof Double) {
+            sql = sql.replaceFirst("\\?", param.toString());
+        }
+        // 해당 파라미터의 클래스가 String인 경우
+        else if (param instanceof String) {
+            sql = sql.replaceFirst("\\?", "'" + param + "'");
+        }
+        // 해당 파라미터의 클래스가 Map인 경우
+        else if (param instanceof Map) {
+            List<ParameterMapping> paramMapping = boundSql.getParameterMappings();
+            for (ParameterMapping mapping : paramMapping) {
+                String propValue = mapping.getProperty();
+                Object value = ((Map) param).get(propValue);
+                if (value == null) {
+                    continue;
+                }
+
+                if (value instanceof String) {
+                    sql = sql.replaceFirst("\\?", "'" + value + "'");
+                } else {
+                    sql = sql.replaceFirst("\\?", value.toString());
+                }
+            }
+        }
+        // 해당 파라미터의 클래스가 사용자 정의 클래스인 경우
+        else {
+            List<ParameterMapping> paramMapping = boundSql.getParameterMappings();
+            Class<? extends Object> paramClass = param.getClass();
+
+            for (ParameterMapping mapping : paramMapping) {
+                String propValue = mapping.getProperty();
+                Field field = paramClass.getDeclaredField(propValue);
+                field.setAccessible(true);
+                Class<?> javaType = mapping.getJavaType();
+                if (String.class == javaType) {
+                    sql = sql.replaceFirst("\\?", "'" + field.get(param) + "'");
+                } else {
+                    sql = sql.replaceFirst("\\?", field.get(param).toString());
+                }
+            }
+        }
+
+        // return sql
+        return sql;
+    }
+}

+ 19 - 0
src/main/java/com/lemon/lifecenter/controller/BoardController.java

@@ -360,6 +360,25 @@ public class BoardController extends LifeCenterController {
         return "redirect:/notice/content?postSeq=" + dto.getPostSeq();
     }
     
+    @RequestMapping(value="/qna/content/file", method=RequestMethod.GET)
+    public void boardFileQna(HttpServletRequest request, HttpServletResponse response,
+            @RequestParam(value="postSeq", required=false, defaultValue="") int postSeq) {
+        
+        BoardDTO dto = new BoardDTO();
+        dto.setPostSeq(postSeq);
+        dto.setBoardType("Q");
+        int total = boardService.selectFileCount(dto);
+        
+        if (total > 0) {
+            dto.setPostSeq(postSeq);
+            dto.setBoardType("Q");
+            dto = boardService.selectFile(dto);
+            String filePath = config.filePath + "/" + dto.getFileName();
+            String fileName = dto.getFileOriginalName();
+            LifeCenterFileDownload.download(request, response, filePath, fileName);
+        }
+    }
+    
     @RequestMapping("/qna/list")
     public ModelAndView qnsList(@RequestParam(value="searchTxt", required=false, defaultValue="") String searchTxt,
             @RequestParam(value="selectState", required=false, defaultValue="") String selectState,

+ 47 - 0
src/main/java/com/lemon/lifecenter/dto/QueryLogDTO.java

@@ -0,0 +1,47 @@
+package com.lemon.lifecenter.dto;
+
+public class QueryLogDTO {
+    private int logIdx;
+    private String id = "";
+    private String ip = "";
+    private String createDate = "";
+    private String queryLog = "";
+    private String fullUrl = "";
+    
+    public int getLogIdx() {
+        return logIdx;
+    }
+    public void setLogIdx(int logIdx) {
+        this.logIdx = logIdx;
+    }
+    public String getId() {
+        return id;
+    }
+    public void setId(String id) {
+        this.id = id;
+    }
+    public String getIp() {
+        return ip;
+    }
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+    public String getCreateDate() {
+        return createDate;
+    }
+    public void setCreateDate(String createDate) {
+        this.createDate = createDate;
+    }
+    public String getQueryLog() {
+        return queryLog;
+    }
+    public void setQueryLog(String queryLog) {
+        this.queryLog = queryLog;
+    }
+    public String getFullUrl() {
+        return fullUrl;
+    }
+    public void setFullUrl(String fullUrl) {
+        this.fullUrl = fullUrl;
+    }
+}

+ 12 - 0
src/main/java/com/lemon/lifecenter/mapper/QueryLogMapper.java

@@ -0,0 +1,12 @@
+package com.lemon.lifecenter.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import com.lemon.lifecenter.dto.QueryLogDTO;
+
+@Repository
+@Mapper
+public interface QueryLogMapper {
+    public void insertSysQueryLog( QueryLogDTO dto );
+}

+ 17 - 0
src/main/java/com/lemon/lifecenter/service/QueryLogService.java

@@ -0,0 +1,17 @@
+package com.lemon.lifecenter.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.lemon.lifecenter.dto.QueryLogDTO;
+import com.lemon.lifecenter.mapper.QueryLogMapper;
+
+@Service
+public class QueryLogService {
+    @Autowired
+    private QueryLogMapper mapper;
+    
+    public void insertSysQueryLog( QueryLogDTO dto ) {
+        mapper.insertSysQueryLog(dto);
+    }
+}

+ 5 - 3
src/main/resources/application.properties

@@ -2,7 +2,7 @@ spring.mvc.view.prefix=/WEB-INF/jsp/
 spring.mvc.view.suffix=.jsp
 #spring.mvc.static-path-pattern=/resources
 #spring.resources.static-locations=classpath:/resources/
-
+mybatis.config-location=classpath:mybatis-config.xml
 #spring.datasource.driver-class-name=cubrid.jdbc.driver.CUBRIDDriver
 #spring.datasource.url=jdbc:cubrid:localhost:30000:LIFE_CENTER:::?charset=UTF-8
 spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
@@ -11,14 +11,16 @@ spring.datasource.url=jdbc:log4jdbc:cubrid:118.67.133.187:30000:LIFE_CENTER:::?c
 #spring.datasource.url=jdbc:log4jdbc:cubrid:localhost:30000:LIFE_CENTER:::?charset=UTF-8
 #spring.datasource.driver-class-name=cubrid.jdbc.driver.CUBRIDDriver
 #spring.datasource.url=jdbc:cubrid:10.175.153.104:30000:LIFE_CENTER:::?altHosts=10.175.153.105:30000&charset=UTF-8
-
+#
 spring.datasource.username=dba
 spring.datasource.password=#zo240s!
 spring.datasource.sql-script-encoding=UTF-8
 
+
+
+
 mybatis.type-aliases-package=com.lemon.lifecenter.dto
 mybatis.mapper-locations=mybatis/mapper/**/*.xml
-
 #logging.level.com.lemon.lifecenter.mapper=DEBUG
 
 logging.level.root=debug

+ 7 - 0
src/main/resources/mybatis-config.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?> 
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
+<configuration> <!-- 데이터 소스 관리는 Spring Boot에서 하기 때문에 여기에 작성하지 않는다. --> 
+    <plugins>
+        <plugin interceptor="com.lemon.lifecenter.common.LifeCenterQueryLog"/>
+    </plugins>
+</configuration>

+ 4 - 2
src/main/resources/mybatis/mapper/board/board.xml

@@ -34,7 +34,8 @@
                    BN.VIEWS                                      AS views,
                    (SELECT FILE_EXTENSION 
                      FROM BOARD_ATTACH_FILE BAF
-                    WHERE BN.POST_SEQ = BAF.POST_SEQ)            AS fileExtension
+                    WHERE BN.POST_SEQ = BAF.POST_SEQ 
+                      AND board_type = 'N' )            AS fileExtension
               FROM BOARD_NOTICE BN
              WHERE 1 = 1
          ]]>
@@ -235,7 +236,8 @@
                    VIEWS                                         AS views,
                    (SELECT FILE_EXTENSION
                       FROM BOARD_ATTACH_FILE BAF
-                    WHERE BAF.POST_SEQ = BR.POST_SEQ)            AS fileExtension,
+                    WHERE BAF.POST_SEQ = BR.POST_SEQ
+                      AND board_type = 'Q' )            AS fileExtension,
                    ANSWER_ID                                     AS answerId,
                    ANSWER_CONTENT                                AS answerContent
               FROM BOARD_REQUEST BR

+ 14 - 0
src/main/resources/mybatis/mapper/queryLog/queryLog.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.lemon.lifecenter.mapper.QueryLogMapper">
+    <insert id="insertSysQueryLog" parameterType="QueryLogDTO">
+        <![CDATA[
+            -- insertSysQueryLog
+            INSERT 
+              INTO SYS_QUERY_LOG
+                   ( ID,    IP,    CREATE_DATE, QUERY_LOG,   FULL_URL   )
+             VALUE ( #{id}, #{ip}, NOW(),       #{queryLog}, #{fullUrl} )
+        ]]>
+    </insert>
+</mapper>

+ 16 - 12
src/main/resources/mybatis/mapper/role/role.xml

@@ -191,18 +191,19 @@
     
     <insert id="insertMenuAccessLog" parameterType="RoleDTO">
         <![CDATA[
-                INSERT 
-                  INTO sys_menu_access_log
-                       ( id, ip, create_date, menu_code, success_yn )
-                SELECT #{id}        AS id,
-                       #{ip}        AS ip,
-                       NOW()        AS create_date,
-                       menu_code    AS menu_code,
-                       #{successYn} AS success_yn
-                  FROM sys_menu_list 
-                 WHERE menu_path = #{menuPath}
-                   AND parent_code != '*****'
-                 LIMIT 1
+            -- insertMenuAccessLog
+            INSERT 
+              INTO sys_menu_access_log
+                   ( id, ip, create_date, menu_code, success_yn )
+            SELECT #{id}        AS id,
+                   #{ip}        AS ip,
+                   NOW()        AS create_date,
+                   menu_code    AS menu_code,
+                   #{successYn} AS success_yn
+              FROM sys_menu_list 
+             WHERE menu_path = #{menuPath}
+               AND parent_code != '*****'
+             LIMIT 1
         ]]>
     </insert>
 
@@ -211,6 +212,7 @@
     <!--                    등록되어있지않으면 해당 url은 권한 체크하지않음, 권한체크해야될 url은 sys_menu_list에 필수로 등록할것 -->
     <select id="selectNowPathRoleCheckTotal" parameterType="RoleDTO" resultType="int">
         <![CDATA[
+            -- selectNowPathRoleCheckTotal
             SELECT COUNT(*) total
               FROM sys_menu_list
              WHERE menu_path = #{menuPath}
@@ -221,6 +223,7 @@
     <!-- menu_type 은 C,R,U,D 중에 하나이고 MR.{    }_yn 값이랑 비교해서 Y이면 권한 있음  -->
     <select id="selectNowPathRoleCheckData" parameterType="RoleDTO" resultType="RoleDTO">
         <![CDATA[
+            -- selectNowPathRoleCheckData
             SELECT ML.menu_code                AS menuCode,
                    ML.parent_code              AS parentCode,
                    ML.menu_name                AS menuName,
@@ -281,6 +284,7 @@
     
     <select id="selectSideMenuList" parameterType="RoleDTO" resultType="RoleDTO">
         <![CDATA[
+            -- selectSideMenuList
             SELECT ML.menu_code AS menuCode,
                    ML.menu_name AS menuName,
                    ML.menu_path AS menuPath