2015-11-04 3 views
5

У меня есть код для фильтров, настроенных в приложении весенней загрузки. Мой второй фильтр, который является B, не вызывается, когда я делаю запрос.Весенний фильтр безопасности не вызывается

import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.builders.WebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; 

@Configuration 
@EnableWebMvcSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    public void configure(WebSecurity webSecurity) throws Exception { 
     webSecurity.ignoring().antMatchers(HttpMethod.GET, "/health"); 
    } 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
     http.addFilterBefore(new A(), BasicAuthenticationFilter.class); 
     http.addFilterAfter(new B(), new A().getClass()); 
    } 
} 

import org.springframework.web.filter.GenericFilterBean; 
public class A extends GenericFilterBean { 

    @Override 
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) 
      throws IOException, ServletException { 
     System.out.println("filter A"); 
    } 
} 

import org.springframework.web.filter.GenericFilterBean; 
public class B extends GenericFilterBean { 

    @Override 
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) 
      throws IOException, ServletException { 
     System.out.println("filter B");   
    } 
} 

Edit:

public class A extends GenericFilterBean { 

     @Override 
     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { 
      System.out.println("filter A Before"); 
      arg2.doFilter(arg0,arg1); 
      System.out.println("filter A After"); 
     } 
} 
+0

Не могли бы вы немного расшириться. Какое сообщение об ошибке вы получаете? Что вы пробовали уже решить вашу проблему? – kebs

+0

ну нет ошибки .. он просто не вызывает Фильтр B. – Harshana

+1

Конечно же, и никогда не будет ... Ваш метод 'doFilter' останавливает обработку запроса. Вы должны вызвать 'filterchain.doFilter (запрос, ответ);' продолжить обработку. Вы нарушаете правильную обработку. –

ответ

4

Ваш конфиг правильно. Но вам необходимо передать свой запрос от Filter A до Filter B, как указано M. Deinum. Просто печать не работает. В вашем коде это должно быть, arg2.doFilter() в Filter A.

От docs он говорит,

Типичная реализация этого метода будет следовать следующей схеме:

  1. рассмотреть просьбу
  2. Необязательно обернуть объект запроса с пользовательской реализации до Содержимое фильтра или заголовки для входной фильтрации
  3. Необязательно обернуть объект ответа с пользовательской реализации, чтобы содержание фильтра или заголовков для вывода фильтрации
  4. Либо ссылаться на следующий объект в цепочке с использованием объекта FilterChain (chain.doFilter()) или не проходят по запросу/отклика следующему объекту в цепочке фильтров для блокировки запроса обработка
  5. Прямо заданные заголовки ответа после вызова следующего объекта в цепочке фильтров.
Смежные вопросы