작성
·
332
2
추가 학습을 해 보았더니, 클라이언트로 부터 온 요청은 서블릿 필터가 받게 되고, 서블릿 필터가 처리할 수 없는? 요청은 DelegatingFilterProxy를 통해 스프링 Application Context에 등록된 필터 빈 으로 책임을 위임한다고 나와있는데요.
이때 FilterChainProxy가 서블릿 필터로 부터 DelegatingFilterProxy을 통해 역할을 위임받게 되는건가요?
그렇다면 FilterChainProxy가 위치한 곳은 Spring의 IoC컨테이너일텐데
어떻게 서블릿 컨테이너에 위치한 서블릿 필터가 스프링 컨테이너에 위치한 FilterChainProxy에 필터링 작업을 위임할 수 있게 되는지 궁금합니다.
답변 1
3
네
DelegatingFilterProxy 는 서블릿 필터이지만 이 필터안에서 FilterChainProxy 를 찾게 됩니다.
아래 코드를 보시면 DelegatingFilterProxy 에서 FilterChainProxy 를 찾는 구문이 나옵니다.
protected Filter initDelegate(WebApplicationContext wac) throws ServletException {
String targetBeanName = getTargetBeanName();
Assert.state(targetBeanName != null, "No target bean name set");
Filter delegate = wac.getBean(targetBeanName, Filter.class);
if (isTargetFilterLifecycle()) {
delegate.init(getFilterConfig());
}
return delegate;
}
위 코드중
Filter delegate = wac.getBean(targetBeanName, Filter.class);
이 부분이 스프링 컨테이너인 wac(ApplicationContext) 에서 FilterChainProxy 를 찾아서 위임하는 구문입니다.
다시 풀어서 설명 드리면
서블릿컨테이너에서 DelegatingFilterProxy 이 로드되고 FilterChainProxy 도 스프링 컨테이너에서 로드된 후 DelegatingFilterProxy 가 wac 를 통해 springSecurityFilterChain 빈이름을 가진 필터인 FilterChainProxy 를 얻어서 위임한다고 보시면 됩니다.
DelegatingFilterProxy 가 빈이 아닐지라도 ApplicationContext 를 통해 특정한 빈 이름을 넘겨 주면 해당 빈을 참조가 가능합니다.
DelegatingFilterProxy 클래스의 내부 로직을 좀 더 확인해 보시면 이해하시는데 도움이 됩니다.