JSP 필터는 요청과 응답이 서블릿이나 JSP에 도달하기 전후에 특정 작업을 수행할 수 있게 해주는 강력한 기능입니다. 다음 예제는 클라이언트가 어떤 JSP 파일에 접근할 때마다 해당 클라이언트의 IP 주소와 현재 날짜 및 시간을 출력하는 방법을 보여줍니다. 이 예제를 통해 JSP 필터의 기본 개념을 이해할 수 있으며, 동일한 원리를 응용하면 훨씬 더 정교한 필터 애플리케이션도 작성할 수 있습니다.
1. LogFilter 클래스 작성하기
// 필요한 자바 라이브러리 임포트
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Filter 클래스 구현
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// 초기화 파라미터 가져오기
String testParam = config.getInitParameter("test-param");
// 초기화 파라미터 출력
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws java.io.IOException, ServletException {
// 클라이언트 머신의 IP 주소 가져오기
String ipAddress = request.getRemoteAddr();
// IP 주소와 현재 타임스탬프 기록
System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());
// 요청을 필터 체인의 다음 단계로 전달
chain.doFilter(request,response);
}
public void destroy( ) {
/* 웹 컨테이너가 필터 인스턴스를
서비스에서 제거하기 전에 호출됨 */
}
}코드 주요 포인트
- init(): 필터가 초기화될 때 한 번 호출되며, web.xml에 설정된 초기화 파라미터를 읽어올 수 있습니다.
- doFilter(): 실제 필터링 로직이 수행되는 핵심 메서드입니다. 여기서는 클라이언트 IP와 접속 시간을 로그로 남긴 후,
chain.doFilter()를 호출하여 요청을 다음 필터 또는 대상 리소스로 전달합니다. - destroy(): 웹 컨테이너가 필터를 제거하기 전에 호출되며, 리소스 정리 작업에 사용됩니다.
2. 필터 컴파일 및 배치
LogFilter.java 파일을 일반적인 방식으로 컴파일한 후, 생성된 LogFilter.class 파일을 다음 경로에 복사합니다.
<Tomcat-설치-디렉토리>/webapps/ROOT/WEB-INF/classes
3. web.xml에서 필터 매핑 설정
필터는 정의된 후 URL이나 JSP 파일 이름에 매핑됩니다. 이는 web.xml 파일에서 서블릿을 정의하고 URL 패턴에 매핑하는 방식과 거의 동일합니다. 배포 서술자(deployment descriptor)인 web.xml 파일에 다음과 같이 필터 태그 항목을 추가합니다.
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>매핑 설정 설명
위 설정에서 /* 패턴을 지정했기 때문에 이 필터는 모든 서블릿과 JSP에 적용됩니다. 만약 특정 서블릿이나 일부 JSP에만 필터를 적용하고 싶다면, url-pattern에 해당 경로를 구체적으로 지정하면 됩니다. 예를 들어 /admin/*처럼 특정 디렉터리나 /login.jsp처럼 개별 파일 경로를 지정할 수 있습니다.
4. 실행 결과 확인
설정이 완료되면 아무 서블릿이나 JSP를 호출해 보세요. 그러면 웹 서버 로그에 클라이언트 IP 주소와 접속 시간이 기록되는 것을 확인할 수 있습니다.
또한 콘솔 출력 대신 Log4J 로거를 활용하면 위 로그 내용을 별도의 파일로 저장하여 관리할 수 있어, 운영 환경에서 접속 기록을 체계적으로 추적하는 데 유용합니다.