2014-11-05 2 views
0

스프링 XML 구성에서 사용할 사용자 정의 네임 스페이스를 생성 중입니다. 이미 NamespaceHandlerBeanDefinitionParser을 구현했습니다. 이제 스프링 구성에 <myns:some-awesome-feature />을 넣을 수 있으며 필요한 빈을 자동으로 생성합니다.BeanDefinitionParser에서 스프링 필터를 등록하십시오.

정상적인 스프링 빈을 만드는 것 외에도,이 주석 레지스터를 사용하여 코드를 활용할 수있는 요청에 대한 정보를 추출하려면 OncePerRequestFilter을 갖고 싶습니다. 사용자 지정 XML 태그를 구현할 때 사용할 수있는 두 클래스를 사용하여 프로그래밍 방식으로 필터를 등록하는 방법이 있습니까?

답변

1

web.xml 또는 WebApplicationInitializer을 건드리지 않고는 불가능합니다. 하지만 나중에 번거롭게 수정할 수있는 확장 가능한 솔루션을 만들 수 있습니다.

스프링 시큐리티의 <http pattern='...' security="..."/>은 자동으로 일련의 일련의 필터 콩을 생성하고 등록합니다. 당신이해야 할 일은 을 web.xml에 등록하고 springSecurityFilterChain을 참조하기 만하면됩니다.

같은 솔루션을 만들 수 있습니다. <myns:awesome-http pattern='...' />OncePerRequestFilter을 인스턴스화합니다. web.xml에서 awesomeFilterChain을 참조하는 DelegatingFilterProxy을 선언하고 있습니다. 이후 버전에서는 구성을 변경하지 않고도 체인에 필터를 추가 할 수 있습니다.

필자는 그러한 기능을 구현 한 적이 없지만 가능하다고 확신합니다.

스프링 보안이 <http .../>을 구현 한 방법을 살펴 보려면 시작 지점에서 HttpConfigurationBuilderHttpSecurityBeanDefinitionParser의 출처를 살펴보십시오.

+0

나는 "당신이 정말로 그것을 할 수 없다"는 대답이 두렵다. 'DelegatingFilterProxy'를 사용하면 내가하고 싶은 일의 목적을 상실 할 수 있습니다. 나는 여러 응용 프로그램에서 사용할 수있는 라이브러리를 작성 중입니다. 그래서 커스텀 스프링 태그가 필터를 등록하는 것을 포함하여 필요한 모든 설정을 할 수 있기를 바랬습니다. – Michael

+0

'javax.servlet.ServletContext'에는 필터를 추가 할 수있는 몇 가지 메소드가 있지만 실제로는 호출하지 않을 것입니다. – Michael

+0

그 목적으로'javax.servlet.ServletContext'를 사용할 수 없습니다. 'ServletContext :: addFilter'는 초기화 중에 만 사용할 수 있으므로 라이브러리 코드가 실제로 시작되기 직전입니다. 스프링 보안은 다른 방법이 없기 때문에'DelegatingFilterProxy'에 있습니다. 물론 서블릿 3.0 컨테이너에서 @ WebFilter를 사용할 수 있습니다. 그러나 서블릿 2.x 스펙을 더 이상 지원할 수 없으며 의존성 삽입을 잃어 버리고 특정 필터 순서를 요구할 때 다시'web.xml '에 의존해야합니다. –

관련 문제