티스토리 뷰

 

 

logfilter.jsp

package filter;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.text.*;
import java.io.*;

public class logfilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("WebMarket 초기화 .....");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("접속한 클라이언트 IP : " + request.getRemoteAddr());
		long start = System.currentTimeMillis();
		System.out.println("접근한 URL 경로 : "+getURLPath(request));
		System.out.println("요청 처리 시작 시각 : "+getCurrentTime());
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
	private String getURLPath(ServletRequest request) {
		HttpServletRequest req;
		String currentPath="";
		String queryString="";
		StringBuffer currentPath2;
		if(request instanceof HttpServletRequest) {
			req = (HttpServletRequest)request;
			currentPath = req.getRequestURI();
			queryString = req.getQueryString();
			queryString = queryString == null ? "" : "?" + queryString;
		}
		return currentPath+queryString;
	}
	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());
	}
	
}

 

 

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>
	<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>
		<filter-name>logfilefilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

 

코드를 살펴보면 filter가 두개인데 url-pattern은 /*(웹앱 안의 전부)으로 동일하다.

이럴 경우 두개가 항상 같이 실행이된다.

그렇기 때문에 doFilter 동작도 함께한다.

어떠한 방식으로 동작하냐면, 첫번째 실행되는 logfilter에서 doFilter를 실행을 하고 chain.doFilter(request, response)를 만나면 다음 filter로 이동을 하여 실행하게 되는데 lofilefilter의 doFilter를 실행하게 된다.

그리고 다시 logfilefilter의 chain.doFilter을 실행하여 다음 filter가 존재하는지 보고 없으니 다시 돌아와 남은 코드들을 실행 후 다시 logfilter로 돌아와 남은 코드를 이어 실행한다.

 

 

 

logfilefilter.jsp

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;
	@Override
	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		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("로그 파일을 열 수 없습니다.");
		}
	}

	@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 ");
		writer.println("--------------------------------------------------");
	}



	@Override
	public void destroy() {
		writer.close();
	}

	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;
	}
	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());
	}
}

 

 

 

결과

 

<init-param>
<param-name>filename</param-name>
<param-value>c:\\logs\\webmarket.log</param-value>
</init-param> 를 통해파일을 생성하고 

미리 만들어 놓은 log폴더에 webmarket.log라는 파일이 생성된 것을 볼 수 있다.

 

 

 

 

 

 

 

req.getReuqestURL()로 출력하면 http://localhost:8080/webmarket/welcome.jsp 와 같은 형태의 주소를 받을 수 있다.

/를 기준으로 문자를 잘라서 출력하고자하면 split을 사용해야 한다.

	private String getURLPath(ServletRequest request) {
		HttpServletRequest req;
		String currentPath="";
		String queryString="";
		StringBuffer currentPath2;
		if(request instanceof HttpServletRequest) {
			req = (HttpServletRequest)request;
			currentPath = req.getRequestURI();
			currentPath2 = req.getRequestURL();
			
			String a=currentPath2.toString();
			System.out.println(a);
			String b[]=a.split("/");
			for(int i=0; i<b.length; i++) {
				System.out.println(b[i]);
			}
			
			queryString = req.getQueryString();
			queryString = queryString == null ? "" : "?" + queryString;
		}

변수 선언을 먼저 해주고 req.getRequestURL을 사용하여 주소를 불러왔다.

그 후 toString()을 사용하여 객체의 정보를 문자열로 변형 시켜주었다.

문자열(객체)를 담는 배열 b를 선언하고 그 안에 a의 값을 /를 기준으로 하여 잘라 배열에 저장했다.

그 후 for문을 사용하여 문자열 배열 0번부터 끝까지 값을 출력해주었다.

 

 

 

결과

split 사용하여 문자를 잘라 출력

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday