๐ŸƒSpring Filter์™€ Interceptor

1 minute read

Filter

  • ์Šคํ”„๋ง์˜ AOP์ฒ˜๋Ÿผ ์„œ๋ธ”๋ฆฟ์˜ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์š”์†Œ๊ฐ€ Filter์ด๋‹ค.

Filter์˜ ํ๋ฆ„(Filter Chain)

HTTP REQUEST -> WAS -> FILTER1 โ€”> FILTER2 -> โ€ฆ -> SERVLET -> CONTROLLER  

Filter ๊ตฌํ˜„

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 {  
		HttpServletRequest httpRequest = (HttpServletRequest)request;  
		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);  
		}  
	}  
  
	@Override  
	public default void destroy() {  
		log.info("log filter destroy");  
	}  
}  

Filter์˜ ๋“ฑ๋ก

  • Configuration์—์„œ FilterRegistrationBean์„ ์ด์šฉํ•˜์—ฌ ๋“ฑ๋กํ•œ๋‹ค.
  • ์šฐ์„ ์ˆœ์œ„, ์ ์šฉํ•  url ํŒจํ„ด ๋“ฑ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
@Configuration  
public class WebConfig {  
  
	@Bean  
	public FilterRegistrationBean logFilter() {  
		FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();  
  
		filterRegistrationBean.setFilter(new LogFilter());  
		filterRegistrationBean.setOrder(1);  
		filterRegistrationBean.addUrlPattern("/login");  
		return filterRegistrationBean;  
	}  
}  

Interceptor

  • Filter๋Š” ์„œ๋ธ”๋ฆฟ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ฉฐ, Interceptor๋Š” ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๋” ๋›ฐ์–ด๋‚œ ๋ถ€๋ถ„์ด ๋งŽ๋‹ค.

Interceptor์˜ ํ๋ฆ„

  • ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ Dispatcher servlet ์ดํ›„์— ์ ์šฉ๋œ๋‹ค.
HTTP REQUEST -> WAS -> FILTER1 โ€”> FILTER2 -> โ€ฆ -> SERVLET -> INTERCEPTOR1 -> INTERCEPTOR2 -> โ€ฆ -> CONTROLLER  

Interceptor ๊ตฌํ˜„

public class LogInterceptor implements HandlerInterceptor {  
  
	@Override  
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
		// ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„  
		return true;	// false๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.  
	}  
  
	@Override  
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
		// ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.  
	}  
  
	@Override  
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  
		// ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํ˜ธ์ถœ๋œ๋‹ค.  
	}  
}  

Interceptor ๋“ฑ๋ก

@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
	@Override  
	public void addInterceptors(InterceptorRegistry registry) {  
		registry.addInterceptor(new LogInterceptor())  
			.order(1)  
			.addPathPatterns("/login")  
			.excludePathPatterns("/css");  
	}  
}