Filter
스프링에서 지원하는 기능은 아니고 javaee에서 지원하는 것으로 Dispatcher Servlet 이전에 실행되어 리소스에 대한 요청과 응답에 대해 필터링 작업을 하는 object이다. 인증, 로깅, 암호화 등에 사용할 수 있다.
더보기
Dispatcher Servlet은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)이다.
필터의 실행 메소드 종류
- void init(FilterConfig filterConfig)
필터 인스턴스 초기화 시 실행되는 메서드 - void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
필터와 매칭된 클라이언트 요청시 호출되는 메소드.
필요한 처리로직을 구현 후 파라미터로 받은 FilterChain를 사용해서 다음 대상으로 요청을 넘겨준다.
서블릿이 실행되기 전에 처리할 작업은 chain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 chain.doFilter() 이후에 작성해야한다. - void destroy()
필터 종료 메서드로 웹 컨테이너에서 호출되어 서비스가 끝났음을 나타낸다.
doFilter 구현 예시
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
@Component
public class RequestResponseLoggingFilter implements Filter {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
log.info("Logging Request {} : {}", req.getMethod(), req.getRequestURI()); //서블릿이 실행되기 전에 처리할 작업
chain.doFilter(request, response);
log.info("Logging Response :{}", res.getContentType()); //서블릿이 실행된 후에 처리할 작업
}
}
인터셉터 Interceptor
스프링에서 제공하는 기능으로 Dispatcher Servlet이 Controller에 접근하기전에 가로채서 필요한 기능을 수행하도록 한다.
일종의 빈으로 볼 수 있고, 스프링 영역이므로 다른 빈을 활용가능하기 때문에 주로 비즈니스 로직과 관련있는 (세션체크, 권한관리) 공통 작업 처리에 사용된다. 인터셉터는 여러개를 등록해서 사용할 수 있다.
인터셉터의 실행 메소드 종류
- void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
요청처리 완료 후 즉, 뷰를 렌더링 한 후 실행된다. - void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
비동기 요청 시 PostHandle과 afterCompletion을 대신해서 afterConcurrentHandlingStarted가 수행된다. - void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
컨트롤러 실행 후 실행된다. - boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
컨트롤러가 실행되기 전에 실행된다.
인터셉터 preHandle
아주아주 간단한 세션 체크 preHandle 구현이다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class AuthenticationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(!"OPTIONS".equals(request.getMethod())){
String sessionId = request.getHeader("session-id");
if(sessionId == null) {
throw new Exception("session expired");
}
}
return true;
}
}
인터셉터 설정
인터셉터 작성 후 사용하기 위해서는 WebMvcConfigurer 설정이 필요하다.
import com.test.api.interceptor.ApiInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
AuthenticationInterceptor interceptor;
private static final String[] common = {"/test/**"};
private static final String[] exclude = {"/session", "/exclude/**"};
@Override
public void addInterceptors (InterceptorRegistry registry) {
registry.addInterceptor(interceptor)
.addPathPatterns(common) //적용 대상 url
.excludePathPatterns(exclude) //적용 제외 대상 url
;
}
}
추가
너무 잘 설명해주는 그림이 있어 가져왔다. https://goddaehee.tistory.com/154
👍👍👍👍

참고한 자료들
https://goddaehee.tistory.com/154
'뇌에 쑤셔넣기' 카테고리의 다른 글
배포 전략 - Rolling, Blue-Green, Canary 기법 (0) | 2023.02.14 |
---|---|
CORS (1) | 2023.01.23 |
댓글