고래씌
[Spring] 11-2. 인터셉터 이용해서 로깅 처리 본문
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------------------");
}
}
▶ 결과

'Server > Spring' 카테고리의 다른 글
[Spring] 12-1. 스케쥴러, Quartz를 이용한 회원 비밀번호 변경 알람(ex. 변경한지 3개월 지난경우 알람) (0) | 2024.01.31 |
---|---|
[Spring] 11-3. 로그인 여부 체크하는 인터셉터 (0) | 2024.01.30 |
[Spring] 11-1. 로그 처리 (0) | 2024.01.30 |
[Spring] 10-5. 채팅방 나가기 (0) | 2024.01.30 |
[Spring] 10-4. 채팅방 메세지 통신 (F5를 누르지않아도 바로 생성되도록 작업) (0) | 2024.01.30 |