Visão geral e necessidade de delegar o ProxyFilter no Spring

Visão geral e necessidade de delegar o ProxyFilter no Spring

1. Visão geral

ODelegatingFilterProxy  é um filtro de servlet que permite passar o controle para as classesFilter que têm acesso ao contexto do aplicativo Spring. O Spring Security depende muito dessa técnica.

Neste tutorial, vamos cobrir isso em detalhes.

2. DelegatingFilterProxy

O Javadoc paraDelegatingFilterProxy afirma que é um

Proxy para um filtro de servlet padrão, delegando para um bean gerenciado pelo Spring que implementa a interface do filtro.

Ao usar filtros de servlet, obviamente precisamos declará-los comofilter-class em nosso Java-config ouweb.xml, caso contrário, o contêiner de servlet irá ignorá-los. DelegatingFilterProxy do Spring fornece o link entreweb.xml e o contexto do aplicativo.

2.1. Trabalho Interno de DelegatingFilterProxy

Vamos dar uma olhada em comoDelegatingFilterProxy transfere o controle para nosso bean Spring.

Durante a inicialização,DelegatingFilterProxy buscafilter-namee recupera o bean com aquele nome do contexto do aplicativo Spring. Este bean deve ser do tipojavax.Servlet.Filter, i.e. um filtro de servlet "normal". Os pedidos recebidos serão passados ​​para este bean de filtro.

Resumindo, o métodoDelegatingFilterProxy’sdoFilter() delegará todas as chamadas a um bean Spring, permitindo-nos usar todos os recursos do Spring em nosso bean de filtro.

Se estivermos usando uma configuração baseada em Java, nosso registro de filtro emApplicationInitializer será definido como:

@Override
protected javax.servlet.Filter[] getServletFilters() {
    DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy();
    delegateFilterProxy.setTargetBeanName("applicationFilter");
    return new Filter[]{delegateFilterProxy};
}

Se usarmos XML, então, no arquivoweb.xml:


    applicationFilter
    org.springframework.web.filter.DelegatingFilterProxy

Isso significa que qualquer solicitação pode ser feita para passar pelo filtro definido como Spring bean com o nomeapplicationFilter.

2.2. Necessidade deDelegatingFilterProxy

DelegatingFilterProxy é uma classe no módulo da Web do Spring. Ele fornece recursos para fazer chamadas HTTP passarem por filtros antes de chegar ao destino real. Com a ajuda deDelegatingFilterProxy,, uma classe que implementa a sinterfacejavax.Servlet.Filter pode ser conectada à cadeia de filtros.

Como exemplo, o Spring Security usaDelegatingFilterProxy para tirar proveito dos recursos de injeção de dependência do Spring e interfaces de ciclo de vida para filtros de segurança.

DelegatingFilterProxy também aproveita a chamada de filtros específicos ou múltiplos de acordo com os caminhos de URI de solicitação, fornecendo a configuração no contexto do aplicativo Spring ou emweb.xml.

3. Criação de um filtro personalizado

Conforme descrito acima,DelegatingFilterProxy é um filtro de servlet que delega para um bean gerenciado por Spring específico que implementa a interfaceFilter.

Nas próximas seções, vamos criar um filtro personalizado e configurá-lo usando a configuração baseada em Java e XML.

3.1. Classe de filtro

Vamos criar um filtro simples que registra as informações da solicitação antes que ela prossiga.

Vamos primeiro criar uma classe de filtro personalizada:

@Component("loggingFilter")
public class CustomFilter implements Filter {

    private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void init(FilterConfig config) throws ServletException {
        // initialize something
    }

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

        HttpServletRequest req = (HttpServletRequest) request;
        LOGGER.info("Request Info : " + req);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // cleanup code, if necessary
    }
}

CustomFilter implementajavax.Servlet.Filter. Esta classe possui uma anotação@Component para registrar como Spring bean no contexto do aplicativo. Dessa forma, a classeDelegatingFilterProxy pode encontrar nossa classe de filtro enquanto inicializa a cadeia de filtro.

Note that the name of the Spring bean must be the same as the value in the filter-name provided during the registration of the custom filter in ApplicationInitializer class or in web.xml later  porque a classethe DelegatingFilterProxy procurará o bean de filtro com exatamente o mesmo nome no contexto do aplicativo.

Se não conseguir encontrar um bean com este nome, ele gerará uma exceção na inicialização do aplicativo.

3.2. Configurando o Filtro via Configuração Java

Para registrar um filtro personalizado usando a configuração Java, precisamos substituir o métodogetServletFilters() deAbstractAnnotationConfigDispatcherServletInitializer:

public class ApplicationInitializer
  extends AbstractAnnotationConfigDispatcherServletInitializer {
    // some other methods here

    @Override
    protected javax.servlet.Filter[] getServletFilters() {
        DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy();
        delegateFilterProxy.setTargetBeanName("loggingFilter");
        return new Filter[]{delegateFilterProxy};
    }
}

3.3. Configurando o filtro viaweb.xml

Vamos ver como a configuração do filtro emweb.xml se parece com:


    loggingFilter
    org.springframework.web.filter.DelegatingFilterProxy


    loggingFilter
    /*

O argumentofilter-class é do tipoDelegatingFilterProxy e não da classe de filtro que criamos. Se executarmos este código e acessarmos qualquer URL, o métododoFilter() deCustomFilter será executado e exibirá os detalhes das informações da solicitação no arquivo de log.

4. Conclusão

Neste artigo, cobrimos comoDelegatingFilterProxy funciona e como usá-lo.

Spring Security faz uso extensivo deDelegatingFilterProxy para proteger as chamadas de API da web e recursos contra acesso não autorizado.

O código-fonte está disponívelover on GitHub.