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>