샐님
2023. 7. 15. 07:07
728x90
반응형
1. 서블릿 필터란
- 컨트롤러 등에서 로그인 여부를 하나하나 로직 구현하지 않기 위해 사용
- 이렇게 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사 라고 하며 웹과 관련된 공통 관심사는 서블릿필터 또는 스프링 인터셉터를 사용하는 것이 좋음.
2. 서블릿 필터의 흐름
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러
3. 필터 체인 - 필터를 여러개 설정할수 있다.
HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 필터3 -> 서블릿 -> 컨트롤러
4.필터 인터페이스 - 필터 인터페이스를 구현,등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성,관리함.
package hello.login.web.filter;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;
/**
* http 요청이 올때마다 실행됨
*/
@Slf4j
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("log filter init");
}
@Override
public void destroy() {
log.info("log filter destroy");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("log filter doFilter");
HttpServletRequest httpRequest = (HttpServletRequest) request; // ServletRequest 는 HttpServletRequest 의 부모 인터페이스이다.필요한건 HttpServletRequest 이기때문에 다운 캐스팅해서 사용.
String requestURI = httpRequest.getRequestURI();
String uuid = UUID.randomUUID().toString();
try {
log.info("REQUEST [{}][{}]", uuid,requestURI);
chain.doFilter(request,response);
// 다음 필터가 있으면 필터호출, 없으면 서블릿 호출. 이로직없으면 필터 호출 하지않음.
}catch(Exception e){
throw e;
}finally {
log.info("RESPONSE [{}],[{}]",uuid, requestURI );
}
}
}
5. WebConfig - 필터 등록
package hello.login.web;
import hello.login.web.filter.LogFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean logFilter(){
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*"); // 필터를 적용할 url 패턴지정. 여러개 가능
return filterRegistrationBean;
}
}
728x90
반응형