WEB/JSP

JSP 25 - 쇼핑몰 사이트 만들기(9) ( LogFilter 적용)

inderrom 2023. 1. 17. 11:47

 

<LogFilter.java>

package filter;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LogFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("WebMarket 초기화...");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response
			, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("접속한 클라이언트 IP : " + request.getRemoteAddr());
		long start = System.currentTimeMillis();
		System.out.println("접근한 URL 경로 : " + getURLPath(request));
		System.out.println("요청 처리 시작 시각 : " + getCurrentTime());
		
		//필터가 연속적으로 있다면 다음 필터로 제어 및 요청/응답 정보를 넘겨줌
		chain.doFilter(request, response);
		
		//시스템 현재시간(종료시간)
		long end = System.currentTimeMillis();
		System.out.println("요청 처리 종료 시각 : " + getCurrentTime());
		System.out.println("요청 처리 소요 시간 : " + (end-start) + "ms");//1000분의 1초 단위
		System.out.println("===============================");
	}

	@Override
	public void destroy() {
		
	}
	
	//접근한 URL 경로
	private String getURLPath(ServletRequest request) {
		//ServletRequest(부모) -> HttpServletRequest(자식) : 더 많은 메소드를 사용하기 위함
		//HttpServletRequest는 ServletRequest를 상속
		HttpServletRequest req;
		//요청된 URL경로 : http://localhost/ch12/filter03.jsp		
		String currentPath = "";
		//queryString : 요청파라미터(HTTP파라미터) => name=새롬이
		String queryString = "";
		//instanceof : '레퍼런스'가 가리키는 객체가 해당 '클래스 타입'이면 true, 아니면 false로 처리
		//객체레퍼런스 instanceof 클래스타입
		//부모와 자식 관계인가?
		if(request instanceof HttpServletRequest) {
			req = (HttpServletRequest)request;
			//현재 접속한 URL을 얻어옴
			//요청된 URL경로 : http://localhost/ch12/filter03.jsp	
			currentPath = req.getRequestURI();
			System.out.println("currentPath : " + currentPath);
			//name=새롬이
			queryString = req.getQueryString();
			System.out.println("queryString : " + queryString);
			//3항연산지
			//조건?true일때값:false일때값
			//name=새롬이 -> ?name=새롬이
			queryString = (queryString == null?"":"?"+queryString);
		}
		//http://localhost/ch12/filter03.jsp + ?name=새롬이
		//http://localhost/ch12/filter03.jsp?name=새롬이
		return currentPath + queryString;
	}//end getURLPath()
	
	//현재일시를 리턴해주는 메소드
	private String getCurrentTime() {
		//출력 형식을 설정
		DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		//날짜 객체 생성(싱글톤-주기억장치(ram)에 객체가 1회 생성. 전역변수처럼 공유되어 사용)
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		//현재 일시를 연/월/일 시:분:초 형식으로 바꿈(String타입)
		return formatter.format(calendar.getTime());
	}

}

<web.xml>

  <filter>
  	<filter-name>LogFilter</filter-name>
  	<filter-class>filter.LogFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>LogFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

 

<products.jsp>

를 실행시키면

콘솔에 찍힌다.

 


로그 파일로 저장

 

package filter;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LogFilter implements Filter {
	//jsp에서 메시지를 보여야 하므로 선언.
	PrintWriter writer;
	
	//filterConfig : filename=c:\\logs\\gdi.log
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("WebMarket 초기화...");
		
		//filename는 c:\\logs\\gdi.log
		String filename = filterConfig.getInitParameter("filename");//저장될 경로 및 파일명
		if(filename==null) throw new ServletException("로그 파일의 이름을 찾을 수 없습니다.");
		
		try {
			//new PrintWriter : 파일 객체 생성(true : 기존 버퍼를 비움)
			//new FileWriter : 생성된 파일에 연동(true : 누적됨(append))
			writer = new PrintWriter(new FileWriter(filename, true),true);
		}catch(IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다.");
		}
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response
			, FilterChain chain)
			throws IOException, ServletException {
		writer.println("접속한 클라이언트 IP : " + request.getRemoteAddr());
		long start = System.currentTimeMillis();
		writer.println("접근한 URL 경로 : " + getURLPath(request));
		writer.println("요청 처리 시작 시각 : " + getCurrentTime());
		
		//필터가 연속적으로 있다면 다음 필터로 제어 및 요청/응답 정보를 넘겨줌
		chain.doFilter(request, response);
		
		//시스템 현재시간(종료시간)
		long end = System.currentTimeMillis();
		writer.println("요청 처리 종료 시각 : " + getCurrentTime());
		writer.println("요청 처리 소요 시간 : " + (end-start) + "ms");//1000분의 1초 단위
		writer.println("===============================");
	}

	//필터가 종료되기 직전에 실행
	@Override
	public void destroy() {
		//파일 객체를 닫아줌. 메모리에서 제거
		writer.close();
	}
	
	//접근한 URL 경로
	private String getURLPath(ServletRequest request) {
		//ServletRequest(부모) -> HttpServletRequest(자식) : 더 많은 메소드를 사용하기 위함
		//HttpServletRequest는 ServletRequest를 상속
		HttpServletRequest req;
		//요청된 URL경로 : http://localhost/ch12/filter03.jsp		
		String currentPath = "";
		//queryString : 요청파라미터(HTTP파라미터) => name=개똥이
		String queryString = "";
		//instanceof : '레퍼런스'가 가리키는 객체가 해당 '클래스 타입'이면 true, 아니면 false로 처리
		//객체레퍼런스 instanceof 클래스타입
		//부모와 자식 관계인가?
		if(request instanceof HttpServletRequest) {
			req = (HttpServletRequest)request;
			//현재 접속한 URL을 얻어옴
			//요청된 URL경로 : http://localhost/ch12/filter03.jsp	
			currentPath = req.getRequestURI();
			System.out.println("currentPath : " + currentPath);
			//name=새롬이
			queryString = req.getQueryString();
			System.out.println("queryString : " + queryString);
			//3항연산지
			//조건?true일때값:false일때값
			//name=새롬이 -> ?name=새롬이
			queryString = (queryString == null?"":"?"+queryString);
		}
		//http://localhost/ch12/filter03.jsp + ?name=새롬이
		//http://localhost/ch12/filter03.jsp?name=새롬이
		return currentPath + queryString;
	}//end getURLPath()
	
	//현재일시를 리턴해주는 메소드
	private String getCurrentTime() {
		//출력 형식을 설정
		DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		//날짜 객체 생성(싱글톤-주기억장치(ram)에 객체가 1회 생성. 전역변수처럼 공유되어 사용)
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		//현재 일시를 연/월/일 시:분:초 형식으로 바꿈(String타입)
		return formatter.format(calendar.getTime());
	}

}

<web.xml>

  <!-- /*(모든 요청)이 요청되면 LogFilter 필터 수행  -->
  <filter>
  	<filter-name>LogFilter</filter-name>
  	<filter-class>filter.LogFilter</filter-class>
  	<init-param>
  		<param-name>filename</param-name>
  		<param-value>c:\\logs\\gdi.log</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>LogFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>