728x90
LogfileFilter 클래스를 생성한다.
생성된 Class에 Filter-java.servlet을 implements(상속) 해주고
상속된 메소드를 오버라이딩 해준다.
보기좋게 intit -> doFilter -> destroy순으로 순서를 정렬해줌
web.xml로 가서
filter태그와
filter-mapping 태그를 정의 해주고
init-param에 파라미터값을 저장해준다.
여기서 filter태그와
filter-mapping 태그 안에 있는
filter-name이 같아야 하고
filter태그안에 filter-class에
패키지.클래스명
filter-mapping태그안에 url-pattern에
jsp파일 URL을 작성해준다.
<!-- 로그 파일 저장 -->
<filter>
<filter-name>LogFileFilter</filter-name>
<filter-class>filter.LogFileFilter</filter-class>
<!-- 로그가 저장될 파일의 위치 지정. LogFileFilter의 init()메소드에 초기화 파라미터를 보냄 -->
<init-param>
<param-name>filename</param-name>
<param-value>c:\\logs\\monitor.log</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFileFilter</filter-name>
<url-pattern>/ch12/filter02_process.jsp</url-pattern>
</filter-mapping>
그리고 다시 class로 돌아와서
나머지 코드를 작성해주고
filterConfig.getInitPatameter("filename"); 경로에 파일이 없기 떄문에
경로에 파일을 미리 만들어 둔다.
파일 생성하고 클래스로 돌아와서 메소드 작성
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 LogfileFilter implements Filter{
private FilterConfig filterConfig = null;
//파일로 만들어야 하므로 파일객체를 전역변수 형태로 선언
PrintWriter writer;
/*
<init-param>
<param-name>filename</param-name>
<param-value>c:\\logs\\monitor.log</param-value>
</init-param>
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String filename =
filterConfig.getInitParameter("filename"); //c:\\logs\\monitor.log
this.filterConfig = filterConfig;
//FileWriter(String fileName,boolean true/false)
//1) true : 기존 내용에 새로운 내용이 추가(append)
//2) false : 기존 내용을 지고 덮어쓰기(overwrite)
//PrintWriter(출력대상, boolean true/false)
//1) true : Auto flush -> writer.flush()를 생략함
//2) false : Auto flush 안함
try {
writer = new PrintWriter(new FileWriter(filename,true),true);
//monitor.log 파일이 없으면 자동 생성
//이렇게 하겟다라고 설계
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 {
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
writer.println("접속한 클라이언트 id : "+id);
writer.println("접속한 클라이언트 passwd : "+ passwd);
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");
writer.println("=============================================");
}
@Override
public void destroy() {
//파일 객체를 닫아줌, 메모리에서 제거
writer.close();
}
//접근한 URL 결로 리턴 메소드
//ch12/filter02_process.jsp?name=개똥이
// ServletRequest(국밥) -> HttpServletRequest(콩나물국밥) : 조금더 상세한 정보
private String getURLPath(ServletRequest request) {
//HttpServletRequest인터페이스는 ServletRequest 인W터페이스를 상속받음
HttpServletRequest req;
//currentPath : URL경로 => ch12/filter02_process.jsp
String currentPath = "";
//cueryString : 요청파라미터 => name = 개똥이
String queryString ="";
//instanceof 연산자 : 객체가 어떤 클래스인지 , 어떤 클래스를 상속받았는지 확인할 때 사용
if(request instanceof HttpServletRequest) {
//자식 = (cast)부모
req = (HttpServletRequest)request;
currentPath = req.getRequestURI(); // ch12/filter02_process.jsp
System.out.println(currentPath);
queryString = req.getQueryString(); //name =개똥이
//삼항연산자
queryString = queryString == null? "":"?"+ queryString;
}
req = (HttpServletRequest)request;
//ch12/filter02_process.jsp?name =개똥이
return currentPath + queryString;
}
//현재 시간을 얻어오는 메소드
private String getCurrentTime() {
//2023/07/13 10:25:12
DateFormat formatter = new SimpleDateFormat("yyyy/MM//dd HH:mm:ss");
//캘린더 객체 생성(싱글톤 : 메모리에 1번 생성하고 전역변수처럼 사용)
Calendar calendar = Calendar.getInstance();
//톰캣서버에서 제공해주는 시스템 련재 시간을 구해서 캘린더 객체에 세팅한다.
calendar.setTimeInMillis(System.currentTimeMillis());
return formatter.format(calendar.getTime());
}
}
해석은 알아서...
실행을 하면 파일이 생성되었다고 문자가 출력되고
접속해서 사이트에 아이디 비밀번호를 치면
아까 만들어 놨던 폴더에 만들어진 메모장 발견
메모장에 들어가 보면
이렇게 출력된것을 볼 수 있다.
아이디와 비밀번호는
개인정보를 위해 없애주는게 맞지만
실험삼아 해봄
'JSP > JSP기초' 카테고리의 다른 글
JSP(ch13) 세션(session) (0) | 2023.07.13 |
---|---|
JSP(Ch12) 필터 사용 로그기록 파일,콘솔 동시 출력 (0) | 2023.07.13 |
JSP(Ch12) 필터 사용하는 방법 두 번째 예제 (0) | 2023.07.12 |
JSP(Ch12) 필터 사용하는 방법 첫 번째 예제 (0) | 2023.07.12 |
JSP try-catch-finally를 이용한 예외처리 (0) | 2023.07.11 |