SpringBoot

[SpringBoot] Filter 설정 및 개념

Jeong Jeon
반응형

Spring에서 사용하다가 SpringBoot로 넘어가면서 기존에 정리해놓지 않았던 내용들을 적어놓으려고 한다.

 

 

필터란? Servlet의 ServletContext의 기능으로 보고, 사용자에 의해 서블릿이 호출 되기 전과 후로 사용자 요청/응답의 헤더 정보등을 검사 하고, 설정할 수 있다.

 

필터와 인터셉터의 차이점

필터의 작동 위치? : DispatcherServlet 앞에서 먼저 동작

인터셉터의 작동 위치 ? : 인터셉터는 DispatcherServlet에서 Controllr(Handler) 사이에서 동작

  • 필터
    • Servlet Context의 기능
    • 스프링 기능을 활용하기에 어려움 => 별도로 의존성을 주입해주어야 된다.
    • 일반적으로 인코딩, CORS, XSS, LOG, 인증, 권한 등 을 구현
  • 인터셉터
    • Spring Context의 기능이며 일종의 빈
    • 스프링 컨테이너이기에 다른 빈을 주입하여 사용 가능
    • 다른 빈을 활용 가능하기에 인증, 권한 등을 구현

 

Filter를 설정하는 방법은 두가지로 나뉜다.

방법1) FilterRegistrationBean

FilterRegistrationBean으로 필터 등록자바 프로그래밍 방식으로 FilterRegistrationBean을 이용해서 필터로 등록한 후에 WebMvcConfigurer을 상속 받아 설정 후 빈으로 등록하는 방식

 

소스 코드

public class CORSFilter implements Filter{


	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("===========Filter-Init============");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		System.out.println("===========doFilter============");
		chain.doFilter(req, res);
	}

	@Override
	public void destroy() {
		System.out.println("===========Filter-Destroy============");
	}

}

Filter를 Implements한 원하는 필터 Class를 만든다.

해당 필터에서 필요한 로직을 구현한다.

 

@Configuration
public class WebConfig implements WebMvcConfigurer{

	...
    
	@Bean
	public FilterRegistrationBean getFilterRegistrationBean() {
		FilterRegistrationBean registrationBean = new FilterRegistrationBean(new CORSFilter());
		registrationBean.setOrder(Integer.MIN_VALUE);
		//registrationBean.addUrlPatterns("/*"); //필요한경우 모든 경로로 설정가능
		registrationBean.setUrlPatterns(Arrays.asList("/board/*"));
		return registrationBean;
	}

}

첫번째로 @Bean으로 해당 메서드를 Spring에서 관리하는 아이로 만든다.

그다음 FilterRegistrationBean에 내가 만든 Filter를 등록시킨다.

 

방법2) @WebFilter 어노테이션

필터 등록내장 컨테이너를 사용하는 스프링부트에서 지원하는 어노테이션인 @WebServlet, @WebFilter 및 @WebListener 선언해서 자동 등록 후 @ServletComponentScan로 이용하는 방식

 

소스 코드

@WebFilter(urlPatterns = "/*")
public class WebFilterConfig implements Filter{

	private FilterConfig filterConfig = null;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		this.filterConfig = filterConfig;
		System.out.println("===========Filter-Init============");
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		HttpSession session = request.getSession();
		//접속 경로
		System.out.println("===========doFilter============");
		chain.doFilter(req, res);

	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("===========Filter-Destroy============");
	}


}

다른 점은 @WebFilter 어노테이션으로 끝냈다는것이다.

어노테이션 뒤에 urlPattern을 지정하여 Filter를 통과시키고싶은 url들을 지정해서 사용하면 된다.

 

반응형