Vejo isso nos meus aplicativos Spring MVC web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Estou tentando descobrir por que está lá e se é realmente necessário.
Encontrei essa explicação nos documentos do Spring, mas isso não me ajuda a entender:
Parece sugerir que esse componente é a "cola" entre os servlets definidos em web.xml
e os componentes definidos na primavera applicationContext.xml
.
7.1 DelegatingFilterProxy
Ao usar filtros de servlet, obviamente você precisa declará-los no seu
web.xml
, ou eles serão ignorados pelo contêiner do servlet. No Spring Security, as classes de filtro também são Spring beans definidas no contexto do aplicativo e, portanto, capazes de tirar proveito dos ricos recursos de injeção de dependências e interfaces do ciclo de vida do Spring. O Spring'sDelegatingFilterProxy
fornece o link entreweb.xml
e o contexto do aplicativo.Ao usar o DelegatingFilterProxy, você verá algo assim no
web.xml
arquivo:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Observe que o filtro é realmente uma
DelegatingFilterProxy
classe, e não a classe que realmente implementará a lógica do filtro. O queDelegatingFilterProxy
faz é delegar os métodos do Filter através de um bean que é obtido no contexto do aplicativo Spring. Isso permite que o bean se beneficie do suporte ao ciclo de vida do contexto do aplicativo da web Spring e da flexibilidade de configuração. O bean deve ser implementadojavax.servlet.Filter
e deve ter o mesmo nome que o do elemento filter-name. Leia o Javadoc para DelegatingFilterProxy para obter mais informações
Então, se eu tirar isso da minha web.xml
, o que vai acontecer? Meus servlets não poderão se comunicar com o contêiner Spring? **
fonte
Você sabe o que é um filtro de servlet e como ele funciona? É uma parte muito útil das especificações do servlet, permitindo aplicar conceitos do tipo AOP ao atendimento de solicitações HTTP. Muitas estruturas usam implementações de filtro para várias coisas, e não é incomum encontrar implementações personalizadas delas porque são muito simples de escrever e úteis. Em um aplicativo Spring, a maioria das coisas que seu aplicativo pode fazer está nos seus beans Spring. Uma instância de filtro, no entanto, é controlada pelo contêiner Servlet. O contêiner instancia, inicializa e destrói. A especificação Servlet não requer nenhum tipo de integração com o Spring; portanto, você fica com um conceito realmente útil (filtros), sem uma maneira conveniente de vinculá-lo ao seu aplicativo Spring e aos beans que fazem o trabalho.
Digite o DelegatingFilterProxy. Você escreve uma implementação de Filtro e o torna um bean Spring, mas, em vez de adicionar sua própria classe Filter ao web.xml, usa o DelegatingFilterProxy e fornece o nome do bean do seu filtro no contexto Spring. (Se você não fornecer um nome explicitamente, ele usará o "nome do filtro".) Em tempo de execução, o DelegatingFilterProxy lida com a complexidade de encontrar a implementação real - a que você escreveu e configurou no Spring - e encaminhar solicitações para ela . Portanto, no tempo de execução, é como se você tivesse listado seu filtro no web.xml, mas você tem a vantagem de poder conectá-lo como qualquer outro bean Spring.
Se você remover esse mapeamento de filtro do seu web.xml, tudo continuará funcionando, mas nenhum dos seus URLs estará protegido. (Isso pressupõe que o nome "springSecurityFilterChain" descreva com precisão o que ele faz.) Isso ocorre porque esse mapeamento está filtrando todas as solicitações recebidas e transferindo-as para um filtro de segurança definido no seu contexto do Spring.
fonte
O que são filtros de servlet?
Os filtros de servlet são, em geral, um conceito Java WebApp. Você pode ter filtros de servlet em qualquer aplicativo da web, independentemente de usar ou não a estrutura Spring em seu aplicativo.
Esses filtros podem interceptar solicitações antes de atingirem o servlet de destino. Você pode implementar funcionalidades comuns, como autorização, em filtros de servlet. Depois de implementado, você pode configurar o filtro em seu web.xml para ser aplicado a um servlet específico, padrões de URL de solicitação específicos ou todos os padrões de URL.
Onde os filtros de servlet são usados?
Os aplicativos da web modernos podem ter dezenas desses filtros. Coisas como autorização, armazenamento em cache, gerenciamento de sessões ORM e injeção de dependência geralmente são implementadas com o auxílio do filtro de servlet. Todos esses filtros precisam ser registrados
web.xml
.Instanciando filtros de servlet - sem Spring Framework
Seu contêiner de servlet cria instâncias de Filtros declaradas
web.xml
e as chama nos horários apropriados (por exemplo, ao atender solicitações de servlet). Agora, se você é como a maioria dos fãs de Injeção de Dependência (DI), provavelmente diria que a criação de instâncias é o que minha estrutura de DI (Spring) faz melhor. Não consigo criar meus filtros de servlet com o Spring para que eles sejam passíveis de todas as vantagens de DI?DelegatingFilterProxy
, para que o Spring crie suas instâncias de filtroÉ aqui que as
DelegatingFilterProxy
etapas.DelegatingFilterProxy
É uma impelmentação dajavax.servlet.Filter
interface fornecida pelo Spring Framework. Depois de configurar oDelegatingFilterProxy
web.xml, você pode declarar os beans reais que fazem a filtragem na sua configuração de primavera. Dessa forma, o Spring cria as instâncias de beans que fazem a filtragem real e você pode usar o DI para configurar esses beans.Observe que você precisa apenas de uma única
DelegatingFilterProxy
declaração,web.xml
mas pode ter vários filtrosbean
encadeados no contexto do aplicativo.fonte
O problema é que os filtros de servlet são gerenciados pelo contêiner de servlet, e não pela mola. E pode ser necessário injetar alguns componentes da mola em seus filtros.
Então, se você precisar de algo como:
então você precisa do proxy do filtro de delegação.
fonte
Você está certo sobre coisas de "cola". Conforme escrito em JavaDocs do FilterChainProxy :
Consulte a seção FIlterChainProxy do blog Behind the Spring Security Namespace para obter uma excelente explicação.
fonte
Fiquei perplexo com "springSecurityFilterChain" em web.xml e encontrei esta resposta no documento de segurança springframework:
Aqui está o link http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
fonte
Já faz muito tempo, mas eu tinha a mesma pergunta e achei o seguinte: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
Tentei executar meu projeto de segurança da primavera removendo o filtro em questão e adicionando-o. O que eu descobri é que se adicionarmos o filtro, somente a chamada será redirecionada para a página de login necessária, conforme definido na configuração de segurança da primavera.
Por isso, concordando com a resposta de @ Ryan.
fonte