본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet 필터 : 로그 기록하기 3

728x90
반응형

 

웹 쇼핑몰 : 로그 기록하기

 

 

필터 처리로 로그 기록하기

 

1. Filter 인터페이스의 구현 클래스 작성하기 :

/src/ 폴더에 filter 패키지를 만든 후 이 패키지에 LogFlter.java 파일을 생성

 

WebMartket/src/filter/LogFilter.java

package filter;

import javax.servlet.* ;
import javax.servlet.http.*;
import java.util.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class LogFilter implements Filter {
	
	//필터를 초기화 하도록 init()메소드를 작성한다.
	public void init(FilterConfig config) throws ServletException{
		System.out.println("WebMarket 초기화 .. ");
	}
	
	//필터를 리소스에 적용하도록 doFilter()메소드를 작성한다. 
	public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
		
		//접속한 클라이언트 IP를 출력하도록 request 내장 객체의 getRemoteAddr()메소드를 작성한다. 
		System.out.println("접속한 클라이언트 IP : " +request.getRemoteAddr());
		long start = System.currentTimeMillis();
		System.out.println(" 접근한 URL 경로 : " + getURLPath(request));//접근한 URL 경로를 출력하도록 사용자 정의 메소드인 getURLPath()를 작성한다.
		System.out.println(" 요청 처리 시작 시각 : " + getCurrentTime());//현재 일시를 출력하도록 사용자 정의 메소드인 getCurrentTime()호출한다. 
		chain.doFilter(request, response);//연속적으로 필터가 있으면 다음 필터로 제어를 넘기도록 FilterChain 객체 타입의 doFilter()메소드를 작성한다. 
		
		long end = System.currentTimeMillis();
		System.out.println("요청 처리 종료 시각 : " + getCurrentTime());//현재 일시를 출력하도록 사용자 정의 메소드인 getCurrentTime()을 호출한다. 
		System.out.println(" 요청 처리 소요 시각 : " + (end-start)+"ms");//요청 처리 요소 시간을 출력하도록 위 21행과 26 행에서 System.currentTimeMillis()메소드로 얻어온 시간을 통해 산출 한다. 
		System.out.println("=========================================================================================================");
	}
	
	
	//필터를 종료하기 전에 호출하도록 destory() 메소드를 작성한다. 
	public void destory() {
		
	}
	
	//현재 접속한 URL을 얻어오는 사용자 정의 메소드인 getURLPath()를 작성한다. 
	private String getURLPath(ServletRequest request) {
		HttpServletRequest req;
		String currentPath="";
		String queryString="";
		if(request instanceof HttpServletRequest) {
			req =(HttpServletRequest)request ;
			currentPath = req.getRequestURI();
			queryString = req.getQueryString();
			queryString = queryString == null ? "" : "?" + queryString;
		}
		
		return currentPath+queryString;
	}
	
	//현재 시간을 얻어오는 사용자 정의 메소드인 getCurrentTime()을 작성한다. 
	private String getCurrentTime() {
		DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(calendar.getTime());
	}
	
}

 

 

2. web.xml 파일에 필터 구성하기

 

web.xml 파일에 다음과 같이 추가 작성한다. 

<filter> <!-- 필터이름 LogFilter와 Filter 인터페이스를 구현한 자바 클래스 LogFilter를 설정하도록 <filter> 요소를 작성한다. -->
		<filter-name>LogFilter</filter-name>
		<filter-class>filter.LogFilter</filter-class>
	</filter>
	<filter-mapping><!-- 필터 이름 LogFilter 와 요청 URL 패턴 /*를 설정하도록 <filter-mapping> 요소를 작성한다. -->
		<filter-name>LogFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

3. 프로젝트 실행하기

웹 브라우저에 'http://localhost:8080/WebMarket/products.jsp' 를 입력하면 console 창에 결과를 확인 할 수 있다.

 

 

 

필터 처리로 로그 기록 파일 만들기

 

1. 로그 기록 파일의 저장 폴더 만들기 : C 드라이브에 logs 폴더를 생성한다. 

 

2. Filter 인터페이스의 구현 클래스 작성하기 :

 

/src/ 폴더의 filter 패키지에 LogFileFilter.java 파일을 생성하고 다음과 같이 작성한다. 

package filter;

import javax.servlet.* ;
import javax.servlet.http.*;
import java.util.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;

public class LogFileFilter implements Filter {
	
	
	PrintWriter writer;
	
	//필터를 초기화 하도록 init()메소드를 작성한다.
	public void init(FilterConfig config) throws ServletException{
		String filename = config.getInitParameter("filename");
		
		if(filename == null)
			throw new ServletException("로그 파일의 이름을 찾을 수 없습니다. ");
		try {
			writer = new PrintWriter(new FileWriter(filename, true), true);
		} catch (IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다. ");
		}
	}
	
	//필터를 리소스에 적용하도록 doFilter()메소드를 작성한다. 
	public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
		
		//접속한 클라이언트 IP를 출력하도록 request 내장 객체의 getRemoteAddr()메소드를 작성한다. 
		writer.println("접속한 클라이언트 IP : " +request.getRemoteAddr());
		long start = System.currentTimeMillis();
		writer.println(" 접근한 URL 경로 : " + getURLPath(request));//접근한 URL 경로를 출력하도록 사용자 정의 메소드인 getURLPath()를 작성한다.
		writer.println(" 요청 처리 시작 시각 : " + getCurrentTime());//현재 일시를 출력하도록 사용자 정의 메소드인 getCurrentTime()호출한다. 
		
		chain.doFilter(request, response);//연속적으로 필터가 있으면 다음 필터로 제어를 넘기도록 FilterChain 객체 타입의 doFilter()메소드를 작성한다. 
		
		long end = System.currentTimeMillis();
		writer.println("요청 처리 종료 시각 : " + getCurrentTime());//현재 일시를 출력하도록 사용자 정의 메소드인 getCurrentTime()을 호출한다. 
		writer.println(" 요청 처리 소요 시각 : " + (end-start)+"ms");//요청 처리 요소 시간을 출력하도록 위 21행과 26 행에서 System.currentTimeMillis()메소드로 얻어온 시간을 통해 산출 한다. 
		writer.println("=========================================================================================================");
	}
	
	
	//필터를 종료하기 전에 호출하도록 destory() 메소드를 작성한다. 
	public void destory() {
		
		writer.close();
	}
	
	//현재 접속한 URL을 얻어오는 사용자 정의 메소드인 getURLPath()를 작성한다. 
	private String getURLPath(ServletRequest request) {
		HttpServletRequest req;
		String currentPath="";
		String queryString="";
		if(request instanceof HttpServletRequest) {
			req =(HttpServletRequest)request ;
			currentPath = req.getRequestURI();
			queryString = req.getQueryString();
			queryString = queryString == null ? "" : "?" + queryString;
		}
		
		return currentPath + queryString;
	}
	
	//현재 시간을 얻어오는 사용자 정의 메소드인 getCurrentTime()을 작성한다. 
	private String getCurrentTime() {
		DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(calendar.getTime());
	}
	
}

 

 

3. web.xml 파일에 필터 등록하기 : 

web.xml 파일에 다음과 같이 추가 작성한다. 

<filter> <!-- 필터이름 LogFileFilter와 Filter 인터페이스를 구현한 자바 클래스 LogFileFilter를 설정하도록 <filter> 요소를 작성한다. -->
		<filter-name>LogFileFilter</filter-name>
		<filter-class>filter.LogFileFilter</filter-class>
		<init-param>
			<param-name>filename</param-name>
			<param-value>c:\\logs\\webmarket.log</param-value>
		</init-param>
	</filter>
	<filter-mapping><!-- 필터 이름 LogFileFilter 와 요청 URL 패턴 /*를 설정하도록 <filter-mapping> 요소를 작성한다. -->
		<filter-name>LogFileFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

4. 프로젝트 실행하기 : 

 

웹 브라우저에 'http://localhost:8080/WebMarket/products.jsp'를 입력하여 실행하면 c 드라이브 에 logs 폴더에 로그가 기록된 파일이 생성된것을 확인할 수 있다.

 

 

요약

01. 필터의 개요
필터는 클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 사전/사후 작업 등 공통적으로 필요한 부분을 처리하는 것을 말한다. 

02. Filter 인터페이스의 구현 클래스
Filter 인터페이스는 필터 기능을 구현하는 데 핵심적인 역할을 한다. 클라이언트와 서버의 리소스 사이에 위치한 필터의 기능을 제공하기 위해 자바 클래스로 구현 해야 한다. 

Filter 인터페이스 메소드의 종류
init(...) 필터 인스턴스의 초기화 메소드이다
doFilter(...) 필터 기능을 작성하는 메소드 이다. 
destory() 필터 인스턴스의 종료 전에 호출되는 메소드이다. 



03. web.xml 파일의 필터 구성

web.xml 파일에 필터를 설정할 때는 <filter> 와 <filter-mapping> 요소를 사용한다. 

728x90
반응형