Filtros de servidor web

Disponible

Introducción a los filtros

Pero eso no es todo. Realmente no crees que los servlets sean tan simples, ¿verdad?

Además de los servlets que ya hemos analizado, también existen los llamados "servlets de utilidad": filtros . Son muy similares a los servlets, pero su trabajo principal es ayudar a los servlets a procesar las solicitudes.

Un filtro es como una secretaria y un servlet es como un director. Antes de que el documento llegue al escritorio del director, pasará por las manos del secretario. Y después de que el director lo firme, volverá a pasar a la secretaria, ya como correspondencia saliente, por ejemplo.

Dicha secretaria puede rechazar algunas de las solicitudes al director (por ejemplo, spam). O dar respuestas estándar a preguntas conocidas por él ("el director no está en su lugar"). Etcétera. Además, puede haber varios secretarios de este tipo: uno puede filtrar el spam para todos los directores a la vez, el otro puede transferir solicitudes entre diferentes directores, etc.

Los filtros funcionan de la misma manera.

servlets de utilidad”

Clases Filter, FilterChain, FilterConfig

Los filtros son muy similares a los servlets, pero con un par de pequeñas diferencias. Para escribir su propio filtro, debe heredar del javax.servlet.Filter.

El filtro también tiene métodos init()y destroy(). En lugar de un método, service()un filtro tiene un doFilter(). E incluso tiene su propia clase FilterConfig. El filtro también se agrega al servlet en el archivo web.xml o mediante la anotación @WebFilter.

Lista de métodos:

Métodos Descripción
1 init(FilterConfig config) inicialización del filtro
2 destroy() descarga del filtro
3 doFilter(ServletRequest , ServletResponse, FilterChain) procesamiento de solicitudes (filtrado)

¿Cuál es la diferencia entre un servlet y un filtro?

Puede haber varios filtros, y procesan secuencialmente la solicitud (y la respuesta). Se combinan en una llamada cadena, e incluso hay una clase especial para ellos FilterChain.

Después de procesar la solicitud en el método, doFilter()debe llamar al método doFilter()del siguiente filtro en la cadena. Ejemplo:

public class MyFilter implements Filter {

  public void init(FilterConfig arg0) throws ServletException {
  }

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {

      PrintWriter out = resp.getWriter();
      out.print("Adding something before the body of the response");

      chain.doFilter(req, resp); // call the next filter in the chain

      out.print("Adding something after the body of the response");
    }

  public void destroy() {
  }
}

En realidad, no puede agregar el cuerpo de la respuesta de esa manera . Formalmente, los filtros y los servlets son independientes entre sí y se pueden cambiar de forma independiente. Pueden ser escritos por diferentes desarrolladores en diferentes momentos. La función de filtro es solo una función de servicio, por ejemplo:

  • Registro de todas las solicitudes entrantes (y respuestas)
  • Compresión de datos
  • Cifrado (y descifrado) de datos
  • Solicitar Validación de Datos
  • Agregar/eliminar encabezados deseados
  • Solicitudes de redireccionamiento
  • Control de acceso (comprobar si el usuario ha iniciado sesión)

Clase RequestDispatcher

doFilter() A veces puede ser necesario llamar a otro servlet mientras se ejecuta un filtro dentro de un método . Para ello, el contenedor tiene un objeto especial RequestDispatcher.

Puedes conseguirlo de dos formas:

  • en el objetoHttpServletRequest
  • en el objetoServletContext

Este objeto se puede utilizar para redirigir una solicitud existente a otro servlet . Por ejemplo, resultó que el usuario no está autorizado y queremos mostrarle una página con autorización. Bueno, o hubo un error en el servidor y queremos mostrar una página de error al usuario :)

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)  throws Exception {
           String path = "/error.html";
           ServletContext servletContext = this.getServletContext();
           RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
           requestDispatcher.forward(request, response);
    }
}

También puede llamar RequestDispatcherdesde un filtro.

public class MyFilter implements Filter {

  public void init(FilterConfig arg0) throws ServletException {
  }

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
           String path = "/error.html";
           ServletContext servletContext = req.getServletContext();
           RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
           requestDispatcher.forward(req, resp);
    }

  public void destroy() {
  }
}

Tenga en cuenta que la solicitud se manejará en el método forward()y no es necesario llamar doFilter()después de su uso RequestDispatcher.

Comparación de redireccionamiento y reenvío

Y un punto más importante. Si desea redirigir al usuario a otro URI en su servlet, puede hacerlo de dos maneras:

  • redirect
  • forward

Ya los hemos analizado, pero por conveniencia lo vuelvo a decir.

Cuando redirige a través de una llamada response.sendRedirect("link"), el servidor devuelve al navegador (cliente) una respuesta 302y el enlace que especificó. Y el navegador, después de analizar la respuesta del servidor, descarga el enlace que le pasaste. Es decir, el enlace en el navegador cambia a uno nuevo.

Si reenvía a través de una llamada requestDispatcher.forward(), se realiza una nueva solicitud dentro del contenedor y su servlet envía su respuesta al navegador (cliente) como respuesta de su servlet. En este caso, el navegador recibe una respuesta del nuevo servlet, pero el enlace en el navegador no cambia.

Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios