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.