고래씌

[Spring] 11-2. 인터셉터 이용해서 로깅 처리 본문

Server/Spring

[Spring] 11-2. 인터셉터 이용해서 로깅 처리

고래씌 2024. 1. 30. 16:31

1. 인터셉터 로깅처리

 

▶ servelt-context.xml

여기로 가서 어떻게 가로챌건지 설정

 

 

 

 

▶ LoggingInterceptor.java

 

- alt + shift + S 키 누르고 아래 3가지 모두 선택

 

 

☞ 컨트롤러마다 일일이 log.info를 하지 않아도 다 log를 찍어준다!!

package com.kh.spring.common.interceptor;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.kh.spring.member.model.vo.Member;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LoggingInterceptor implements HandlerInterceptor {
	
	// 사용자가 사용하고 있는 핸드폰 종류
	private String logMP[] = {"iphone", "ipod", "andriod"};
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		// 접속한 사용자의 장비가 pc인지 모바일인지 확인
		// Header 정보 내부에 사용자가 접속 정보가 다 들어있다
		String currentDevice = "web";
		String logUA = request.getHeader("user-agent").toLowerCase();
		for(String device : logMP) {
			if(logUA.indexOf(device) > -1) { // -1 이상이면 사용자의 접속기기는 모바일이다.
				currentDevice = "mobile";
				break;
			}
		}
		
		// 사용자가 접속한 url, 서버정보 추가
		HttpSession session = request.getSession();
		
		// 사용자의 도메인
		String currentDomain = request.getServerName();
		
		// 사용자의 포트번호
		int currentPort = request.getServerPort();
		
		String queryString = "";
		
		// 사용자의 요청시 전송방법이 get이라면
		if(request.getMethod().equals("GET")) {
			queryString = request.getQueryString();
		}else {
			Map<String, Object> map = request.getParameterMap();  // hashmap형태로 사용자가 요청한 값이 담겨있는 객체
			Object[] keys = map.keySet().toArray();   // map에 저장된 것을 Set계열로 바꾸고 배열형태로 저장 // userId, userPwd
			
			for(int i=0; i<keys.length; i++) {
				if(i > 0) {
					queryString += "&";    // and를 붙혀줌. 두번째 이상 반복이다라면 key=value and ~
				}
				String[] values = (String[]) map.get(keys[i]);  // 사용자가 요청한 값들이 키를 받아 문자열 배열형태로 받음
				queryString += keys[i] + "=";
				
				int count = 0;
				for(String str : values) {
					if(count > 0) {
						queryString += ",";  // interests=movie, game, music ... 이런형태로 출력이 이어질 수 있게끔 처리
					}
					queryString += str;
					count++;
				}
			}
		}
		
		// 파라미터가 아예 없다면, 로그에 포함되지 않도록 조건 추가
		if(queryString == null || queryString.trim().length() == 0) {
			queryString = null;
		}
		
		// 아이디 정보 추가
		String userId = "";
		Member loginUser = (Member) session.getAttribute("loginUser");
		if(loginUser != null) {
			userId = loginUser.getUserId();
		}
		
		// ip정보 추가
		String uri = request.getRequestURI();
		String ip = getIp(request);
		
		// 보안 처리가 된 사이트라면 https 그게 아니라면 http
		String msg = ip + " : " + currentDevice + " : " + userId + " " + (request.isSecure() ? "https" : "http")
			+ "://" + currentDomain + ":" + currentPort + uri + (queryString != null ? "?" + queryString : ""); 
		
		log.info("{}", msg);  // 컨트롤러마다 일일이 log.info를 하지 않아도 다 log를 찍어준다!!
		
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

	private String getIp(HttpServletRequest request) {
		
		String ip = request.getHeader("X-Forwarded-For");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        
        return ip;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
		log.info("modelAndView ={}", modelAndView);
	}

	// jsp 작업 완료된 이후
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
		log.info("-----------------view-----------------");
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
		log.info("-----------------end------------------");
	}
	
	
}

 

 

▶ 결과