<filter>
<filter-name></filter-name> : 필터 이름 설정
<filter-class></filter-class> : 자바 클래스 이름 설정
<init-param> : 매개변수와 값을 설정
<param-name></param-name>
</init-param>
</filter>
<filter-mapping>
<filter-name></filter-name> : 필터 이름 설정
<url-pattern></url-pattern> : URL 패턴 설정
</filter-mapping>
연습 문제 04
Filter 인터페이스를 이용하여 다음 조건에 맞게 JSP 애플리케이션을 만들고 실행 결과를 확인하시오.
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>filter.LogFilter</filter-class>
<init-param>
<param-name>filename</param-name>
<param-value>c:\\logs\\bookmarket.log</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<!-- http://localhost/의 모든 하위 폴더 및 모든 url요청 시 작동 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
LogFilter.java
package filter;
import java.io.File;
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{
PrintWriter writer;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String filename = filterConfig.getInitParameter("filename"); // c:\\logs\\bookmarket.log
try {
writer = new PrintWriter(new FileWriter(filename,true),true); // doFilter에서도 쓰기 위해 전역으로 사용함
File file = new File(filename);
if(!file.exists()) {
file.createNewFile();
writer.println(file.getAbsolutePath() + " 파일이 생성되었습니다."); // 파일 생성했음을 로그에 추가한다는 뜻
}else {//있으면..
System.out.println(file.getAbsolutePath() + " 파일이 생성되어 있습니다.");
}
} 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());
//필터가 연속적으로 있다면 다음 필터로 제어 및 요청(request)/응답(response) 정보를 넘겨줌
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();
}
private String getURLPath(ServletRequest request) {
//HttpServletRequest 인터페이스 는 ServletRequest 인터페이스를 상속받음
HttpServletRequest req;
//currentPath : URL경로 => http://localhost/ch11/readParameterNoErrorPage.jsp
String currentPath = "";
//queryString : 요청파라미터 => name=개똥이
String queryString = "";
//instanceOf 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는 데 사용됨
if(request instanceof HttpServletRequest) {
//자식 = (cast)부모
req = (HttpServletRequest)request;
currentPath = req.getRequestURI(); //http://localhost/ch11/readParameterNoErrorPage.jsp
System.out.println("currentPath : " + currentPath);
queryString = req.getQueryString(); //name=개똥이
System.out.println("queryString : " + queryString);
//삼항연산자
queryString = queryString == null ? "" : "?"+queryString; // 파라미터에 ?를 붙임
}
//http://localhost/ch11/readParameterNoErrorPage.jsp?name=개똥이
return currentPath + queryString;
}//end getURLPath()
//현재 시간을 얻어오는 메소드
private String getCurrentTime() {
//2023/03/31 17:29:12
DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//캘린더 객체 생성(싱글톤 : 메모리에 1번 생성하고 전역변수처럼 사용)
Calendar calendar = Calendar.getInstance();
//톰켓서버에서 제공해주는 시스템 현재 시간을 구해서 캘린더 객체에 세팅
calendar.setTimeInMillis(System.currentTimeMillis());
//2023/03/31 17:29:12 이러한 포맷을 준수하면서 리턴
return formatter.format(calendar.getTime());
}
}