package com.sungardas.enhancedsnapshots.security; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.GenericApplicationListenerAdapter; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.filter.DelegatingFilterProxy; import javax.servlet.Filter; import javax.servlet.ServletException; import java.lang.reflect.Field; public class RefreshingDelegatingFilterProxy extends DelegatingFilterProxy implements ApplicationListener<ContextRefreshedEvent> { private boolean listenerRegistered = false; @Override protected Filter initDelegate(WebApplicationContext wac) throws ServletException { Filter filter = super.initDelegate(wac); if(!listenerRegistered) { ((AbstractApplicationContext) wac).getApplicationListeners().add(new GenericApplicationListenerAdapter(this)); listenerRegistered = true; } return filter; } // TODO: change this in case next bug in spring security project will be resolved: // TODO: https://jira.spring.io/browse/SPR-6228 public void onApplicationEvent(ContextRefreshedEvent event) { try { Field field = DelegatingFilterProxy.class.getDeclaredField("delegate"); field.setAccessible(true); field.set(this, null); field.setAccessible(false); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }