샐님 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
반응형