Descripción general y necesidad de DelegatingFilterProxy en Spring

1. Información general

El DelegatingFilterProxy es un filtro de servlet que permite pasar el control al filtro clases que tienen acceso al contexto de aplicación de primavera. Spring Security se basa en gran medida en esta técnica.

En este tutorial, lo cubriremos en detalle.

2. DelegatingFilterProxy

El Javadoc para DelegatingFilterProxy establece que es un

Proxy para un filtro de servlet estándar, delegando a un bean administrado por Spring que implementa la interfaz de filtro.

Cuando usamos filtros de servlet, obviamente necesitamos declararlos como una clase de filtro en nuestro Java-config o web.xml , de lo contrario, el contenedor de servlets los ignorará. DelegatingFilterProxy de Spring proporciona el enlace entre web.xml y el contexto de la aplicación.

2.1. Trabajo interno de DelegatingFilterProxy

Echemos un vistazo a cómo DelegatingFilterProxy transfiere el control a nuestro bean Spring.

Durante la inicialización, DelegatingFilterProxy obtiene el nombre del filtro y recupera el bean con ese nombre de Spring Application Context. Este bean debe ser de tipo javax.Servlet.Filter, es decir , un filtro de servlet "normal". Las solicitudes entrantes se pasarán a este bean de filtro.

En resumen, el método doFilter () de DelegatingFilterProxy delegará todas las llamadas a un bean Spring, permitiéndonos usar todas las características de Spring dentro de nuestro bean de filtro.

Si usamos una configuración basada en Java, nuestro registro de filtro en ApplicationInitializer se definirá como:

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

Si usamos XML, entonces, en el archivo web.xml :

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

Esto significa que se puede realizar cualquier solicitud para pasar por el filtro definido como Spring bean con el nombre applicationFilter .

2.2. Necesidad de DelegatingFilterProxy

DelegatingFilterProxy es una clase en el módulo web de Spring. Proporciona funciones para hacer que las llamadas HTTP pasen por filtros antes de llegar al destino real. Con la ayuda de DelegatingFilterProxy, una clase que implementa la interfaz javax.Servlet.Filter se puede conectar a la cadena de filtros.

Como ejemplo, Spring Security hace uso de DelegatingFilterProxy para poder aprovechar las funciones de inyección de dependencia de Spring y las interfaces de ciclo de vida para filtros de seguridad.

DelegatingFilterProxy también aprovecha la invocación de filtros específicos o múltiples según las rutas de URI de solicitud al proporcionar la configuración en el contexto de la aplicación Spring o en web.xml.

3. Creación de un filtro personalizado

Como se describió anteriormente, DelegatingFilterProxy es un filtro de servlet en sí mismo que delega a un bean específico administrado por Spring que implementa la interfaz de filtro .

En las siguientes secciones, crearemos un filtro personalizado y lo configuraremos usando una configuración basada en Java y XML.

3.1. Clase de filtro

Vamos a crear un filtro simple que registre la información de la solicitud antes de que la solicitud continúe.

Primero creemos una clase 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 implementa javax.Servlet.Filter . Esta clase tiene una anotación @Component para registrar como Spring bean en el contexto de la aplicación. De esta manera, la clase DelegatingFilterProxy puede encontrar nuestra clase de filtro mientras inicializa la cadena de filtro.

Tenga en cuenta que el nombre del bean Spring debe ser el mismo que el valor en el filtro-nombre proporcionado durante el registro del filtro personalizado en la clase ApplicationInitializer o en web.xml más adelante porque la clase DelegatingFilterProxy buscará el bean de filtro con la exacta mismo nombre en el contexto de la aplicación.

Si no puede encontrar un bean con este nombre, generará una excepción al iniciar la aplicación.

3.2. Configuración del filtro a través de la configuración de Java

Para registrar un filtro personalizado usando la configuración de Java, necesitamos anular el método getServletFilters () de AbstractAnnotationConfigDispatcherServletInitializer :

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. Configuración del filtro a través de web.xml

Veamos cómo se ve la configuración del filtro en web.xml :

 loggingFilter org.springframework.web.filter.DelegatingFilterProxy   loggingFilter /* 

El argumento de la clase de filtro es de tipo DelegatingFilterProxy y no la clase de filtro que creamos. Si ejecutamos este código y presionamos cualquier URL, entonces el método doFilter () del CustomFilter se ejecutará y mostrará los detalles de la información de la solicitud en el archivo de registro.

4. Conclusión

En este artículo, hemos cubierto cómo funciona DelegatingFilterProxy y cómo usarlo.

Spring Security hace un uso extensivo de DelegatingFilterProxy para proteger las llamadas y los recursos de la API web del acceso no autorizado.

El código fuente está disponible en GitHub.