2016-12-22 5 views
0

Я расширяя WebSecurityConfigurerAdapter переопределении метода Configure. Моя цель состоит в том, чтобы поставить фильтр по конкретному URL, который обойти страницу входа в систему и сделать ручную проверку подлинности. Для этого мне нужен фильтр, чтобы быть выполнен только первый раз, когда пользователь попытается достичь SECTION_WITH_FILTER URL. Вот мой код:Spring пользовательских фильтров выполнить только один раз на указанный URL

@Autowired 
MyFilter myFilter; 

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    logger.debug("<CONFIGURE HTTPSECURITY/>"); 

    http 
      .authorizeRequests() 
      .antMatchers("/login*.*", "/error.*", "/resources/**", "/javax**/**").permitAll() 
      .antMatchers("/SECTION_WITH_FILTER/**").permitAll() 
      .antMatchers("/", "/*.jsf", "/**/*.jsf", "/*.faces", "/**/*.faces").hasAnyRole("ADMIN") 
      .anyRequest().authenticated() 
      .and() 
      .formLogin() 
      .loginPage("/login.jsf") 
      .permitAll() 
      .and() 
      .logout() 
      .invalidateHttpSession(false) 
      .logoutSuccessUrl("/") 
      .deleteCookies("JSESSIONID") 
      .permitAll() 
      .and().csrf().disable(); 
    http 
      .addFilterBefore(myFilter, BasicAuthenticationFilter.class); 

} 

Моя проблема заключается в том, что фильтр начинает после того, как каждый представить в какой-либо форме веб-сайта.

Я уже пытался с FilterRegistrationBean используется также для установки фильтра только тогда, когда пользователь переходит к определенному URL:

@Bean 
public FilterRegistrationBean filterRegistration() { 

    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(myFilter); 
    registration.addUrlPatterns("/SECTION_WITH_FILTER/**"); 
    registration.setName("myFilter"); 
    registration.setEnabled(true); 
    return registration; 
} 

Но используя этот метод исключение StackOverflowError брошено.

org.apache.catalina.core.StandardWrapperValve invoke 
GRAVE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause 
java.lang.StackOverflowError 
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) 
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:589) 
... 

Как я могу изменить свой код, чтобы сделать фильтр, указанным для одного URL, который начинается только первый раз, когда пользователь пытается достичь? Благодаря

ответ

2

Вы можете реализовать OncePerRequestFilter, переопределить doFilterInternal способ сделать свой собственный бизнес, и если некоторые URLs не должны фильтровать, вы можете переопределить метод shouldNotFilter.

этот фильтр используется для идентификации того, что запрос уже фильтруют. Реализация по умолчанию основана на настроенном имени конкретного экземпляра фильтра.