Web Application에서 관리되는 영역
Spring Boot Framework에서
Client로 부터 오는 요청/응답에 대해 최초/최종 단계의 위치에 존재하며,
이를 통해서 요청/응답 정보를 변경하거나,
Spring에 의해서 데이터가 변환되기 전의 순수한 Client의 요청/응답 값을 확인 할 수 있다.
유일하게 ServletRequest , ServletResponse의 객체를 변환할 수 있다.
주로 요청/응답의 Logging 용도로 활용하거나,
드물게 인증과 관련된 로직들을 해당 필터에서 처리한다.
이를 선/후 처리 함으로써 Service business logic과 분리시킨다.
Filter 클래스 생성 후 jakarta.servlet.Filter
인터페이스 상속.
Spring boot에서 관리할 수 있게 @Component
어노테이션 붙여줌
import jakarta.servlet.*;
@Component
public class GlobalFilter implements Filter {
}
doFilter 메서드만 오버라이드 한다.
import jakarta.servlet.*;
import java.io.IOException;
@Component
public class GlobalFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 전처리 구간
var httpServletRequest = new ContentCachingRequestWrapper((HttpServletRequest) request);
var httpServletResponse = new ContentCachingResponseWrapper((HttpServletResponse) response);
chain.doFilter(httpServletRequest, httpServletResponse);
// 후처리 구간
String reqContent = new String(httpServletRequest.getContentAsByteArray());
String url = httpServletRequest.getRequestURI();
log.info("request url : {} , request body {}", url , reqContent);
String resContent = new String(httpServletResponse.getContentAsByteArray());
int httpStatus = httpServletResponse.getStatus();
log.info("response status : {} , response body {}", httpStatus , resContent);
httpServletResponse.copyBodyToResponse(); // copyBodyToResponse 를 호출해주어야 반드시 클라이언트가 제대로 된 응답을 받을 수 있다.
}
}
실행 메서드가 있는 Application 파일에 @ServletComponentScan
어노테이션을 붙여준다.
@SpringBootApplication
@ServletComponentScan
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
Filter 파일로 돌아가서 먼저 붙여놓았던 @Component
어노테이션을 지우고
@WebFilter(urlPatterns = "/path/uris/*")
어노테이션을 붙여준다.
이 때, urlPatterns
로는 읽어서 처리할 경로를 입력해주면 된다.
@Slf4j
@WebFilter(urlPatterns = "/filter/user/*")
public class GlobalFilter implements Filter {
...
}