Java - мне нужен собственный весенний фильтр, который должен вызываться после ответа http - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть XML-файл (applicationCtx-security.xml), в котором определены все фильтры безопасности Spring и пользовательские фильтры и их bean-компоненты.Мне нужно реализовать пользовательский фильтр, который должен вызываться после любого ответа http, чтобы я мог очистить свой принципал пользователя после каждого ответа http.

Уже пробовал SecurityContextPersistenceFilter

public class ResponseFilter extends SecurityContextPersistenceFilter implements Filter{

    private static final Log log = LogFactory
            .getLog(ResponseFilter.class);

public static final String USERNAME_KEY = "username";

public ResponseFilter() {
    System.out.println("Inside constructor of ResponseFilter");
}

xml:

<beans:bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
        <beans:property name='securityContextRepository'>
            <beans:bean class="com.web.ResponseFilter">
            </beans:bean>
        </beans:property>
    </beans:bean>

Мой реализованный код не вызывается.Любые предложения?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Вам не нужно регистрировать фильтр как компонент.Но для того, чтобы это работало, вы должны зарегистрировать свой пользовательский фильтр в конфигурации Spring Security, он должен иметь метод doFilter, переопределенный для некоторого пользовательского поведения, в вашем случае вывод сообщения - конструктор предназначен только для инициализациикласс на языке программирования Java.

Вот как это делается с аннотациями, вместо этого вы должны зарегистрировать этот конфиг как bean-компонент в своем XML-файле.

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

// constructor

  @Override
  protected void configure(HttpSecurity http) throws Exception {
  // custom configuration of your http

  //register the filter
  http.addFilterAfter(new ResponseFilter(), ResponseFilter.class);
  }
}

Кроме того, не надоне забудьте поместить свой фильтр в цепочку в переопределенном методе doFilter, например:

@Override
public void doFilter(ServletRequest req, ServletResponse res, 
FilterChain filterChain) throws IOException, ServletException {
  // other code is omitted for brevity
  //move on to the next filter in the chains
  filterChain.doFilter(req, res);
}

SecurityContextPersistenceFilter уже является фильтром, поэтому вам не нужно реализовывать фильтр, и это не класс фильтра.что я бы предложил реализовать в большинстве случаев - лучше вместо этого расширять GenericFilterBean в большинстве случаев.

0 голосов
/ 23 сентября 2019

Ваш фильтр отсутствует doFilter, вам нужно это переопределить.

Пример фильтра будет выглядеть следующим образом

@Component
public class TransactionFilter implements Filter {

    @Override
    public void doFilter
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        LOG.info(
          "Starting a transaction for req : {}", 
          req.getRequestURI());

        chain.doFilter(request, response);
        LOG.info(
          "Committing a transaction for req : {}", 
          req.getRequestURI());
    }

    // other methods 
}

Что бы вы ни указали перед chain.doFilter, оно будет выполнено досервлет.

Все, что вы поместите после него, будет выполнено после того, как метод сервлета service () вернется.

Таким образом, вы можете поставить свою логику после вызова chain.doFilter(request, response);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...