Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Android
- AOP
- 인프런
- Proxy
- Spring Boot
- Servlet
- 자바
- 스프링 핵심 원리
- jpa
- kotlin
- 스프링 핵심 기능
- db
- 김영한
- JPQL
- 알고리즘
- Thymeleaf
- java
- QueryDSL
- spring
- http
- 백준
- pointcut
- 그리디
- Greedy
- Exception
- springdatajpa
- transaction
- JDBC
- 스프링
- SpringBoot
Archives
- Today
- Total
개발자되기 프로젝트
[로그인] Servlet Filter - 요청 로그 본문
모든 요청을 로그로 남기는 필터를 개발해보자.
1. LogFilter
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;
@Slf4j
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("log filter init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("log filter doFilter");
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
String uuid = UUID.randomUUID().toString();
try{
log.info("REQUEST [{}][{}]", uuid, requestURI);
chain.doFilter(request, response); //다음필터 있으면 호출 없으면 Servlet 호출됨
}catch (Exception e){
throw e;
}finally {
log.info("RESPONSE [{}][{}]",uuid, requestURI);
}
}
@Override
public void destroy() {
log.info("log filter destroy");
}
}
- public class LogFilter implements Filter {}
- 필터를 사용하려면 필터 인터페이스를 구현해야 한다.
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- HTTP 요청이 오면 doFilter 가 호출된다.
- ServletRequest request 는 HTTP 요청이 아닌 경우까지 고려해서 만든 인터페이스이다.
- HTTP를 사용하려면 HttpServletRequest httpRequest = (HttpServletRequest) request;
- String uuid = UUID.randomUUID().toString();
- HTTP 요청을 구분하기 위해 요청당 임의의 uuid 를 생성
- log.info("REQUEST [{}][{}]", uuid, requestURI);
- uuid 와 requestURI 를 출력한다.
- chain.doFilter(request, response);
- 다음 필터가 있으면 필터를 호출하고, 필터가 없으면 서블릿을 호출한다.
- 만약 이 로직을 호출하지 않으면 다음 단계로 진행되지 않는다. 여기서 끝남.
2. 필터 등록
import hello.login.web.filter.LogFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean logFilter(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new LogFilter());
filterFilterRegistrationBean.setOrder(1);
filterFilterRegistrationBean.addUrlPatterns("/*"); //모든 url 적용
return filterFilterRegistrationBean;
}
}
- filter 등록을 위한 bean 설정 용 class인 WebConfig를 만들자.->@Configuration 적용
- @Configuration : 해당 클래스가 Spring Container에 등록될 @Bean을 선언한다는 것을 가르킴.
- SpringBoot를 사용하면 FilterRegistrationBean 을 사용해서 등록하면 됨.
- setFilter(new LogFilter()) : 등록할 필터를 지정한다.
- setOrder(1) : 필터는 체인으로 동작한다. 따라서 순서가 필요하다. 낮을 수록 먼저 동작한다.
- addUrlPatterns("/*") : 필터를 적용할 URL 패턴을 지정한다. 한번에 여러 패턴을 지정할 수 있다.
3. 실행 결과
hello.login.web.filter.LogFilter: REQUEST [0a2249f2-cc70-4db4-98d1-492ccf5629dd][/items]
hello.login.web.filter.LogFilter: RESPONSE [0a2249f2-cc70-4db4-98d1-492ccf5629dd][/items]
- 실무에서 HTTP 요청시 같은 요청의 로그에 모두 같은 식별자를 자동으로 남기는 방법
- 즉, 한 요청이 들어와서 나갈 때 까지 자동으로 로그에 같은 식별자를 남기는 방법은
- logback mdc로 참고.
4. GitHub : 210926 Servlet Filter
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[로그인] 스프링 인터셉터 (0) | 2021.09.26 |
---|---|
[로그인] Servlet Filter - 인증 체크 (0) | 2021.09.26 |
[로그인] Servlet Filter (0) | 2021.09.26 |
[로그인] Session 정보와 TimeOut 설정 (0) | 2021.09.26 |
[로그인] 로그인 처리 - Servlet HttpSession 2 (0) | 2021.09.26 |
Comments