Una visión clara del principio de funcionamiento SpringMVC, e interceptores y filtros diferencia entre la orden de ejecución

En primer lugar, un caso en el que la figura aclarar filtro y el proceso en respuesta a la solicitud interceptor SpringMVC

proceso de filtro y la interceptación en el caso de una respuesta de solicitud SpringMVC

  • Los servidores Web : red de interfuncionamiento procedimiento para el procesamiento de solicitudes y respuestas entre un cliente y un servidor, el servidor Web puede solicitar y la respuesta deben ajustarse al procesamiento de protocolo HTTP. Dijo sin rodeos, solicitando los datos que pasan por el cliente al servidor Web, servidor Web, y la respuesta de datos al cliente son cadenas, o que el servidor Web sólo puede manejar los recursos estáticos. Cuando un cliente inicia una petición HTTP, servidor Web primero comprueba si el contenido solicitado por el cliente es recursos estáticos. Si se trata de un servidor Web recurso estático directamente a los recursos estáticos de vuelta al cliente. Cuando la petición del descubrimiento del cliente de contenido es un contenido dinámico, el servidor Web hacia delante se procesará la solicitud para el contenedor de servlets. Contenedor servlet trató reenvía la respuesta al servidor Web será transformado para adaptarse a la respuesta HTTP al formato de protocolo HTTP.
  • contenedores de servlets : un servidor Web para apoyar la parte extensiones de servlets de la interacción dinámica entre el cliente y el servidor Web. Sin rodeos palabras, es el servidor Web no puede entender la petición HTTP, como es comprensible dado el contenedor de servlets. Entonces, contenedor de servlets interpretado como el resultado de la solicitud se apreciará que el servidor Web, un servidor web en respuesta a las solicitudes enviadas al cliente.
  • Filtro Filtro : Filtro Filtro de la misma y se basan en componentes de Java Servlet Web, gestionado por el contenedor de servlets, para generar contenido dinámico. Ese método se lleva a cabo, el init inicialización filtro filter (), filtrando la doFilter (), destruir destruir (), etc. son invocados por el contenedor Servlet. Tenga en cuenta que cuando el servidor Web se descubre contenido petición HTTP dinámico, remite la solicitud al contenedor de servlets. contenedor de servlets primero tuvo que encontrar el servlet correspondiente al proceso, pero cuando hay una solicitud de filtro coincidente y filtro, filtro contenedor de servlets adquirirá un primer filtro para procesar la solicitud de nuevo, y luego al servlet de procesar. Dado que el filtro es el uso devoluciones de llamada de filtro, cuando el filtro filtro Servlet trató respuesta Servlet continuará ser reprocesado. Visto desde la fig., El ciclo de vida del recipiente Servlet es más largo que antes & Spring contenedor, por lo que el contenedor de primavera Bean no se inyecta en el filtro de filtro utilizado. Esta característica también es generalmente un resultado directo de filtro utilizado principalmente para el procesamiento de solicitudes y respuestas, más que en los procesos de negocio específicos.
  • Interceptor interceptor : interceptor interceptor es administrado por resorte, el resorte COI almacena en un contenedor de montaje, es una implementación de programación orientada a aspectos AOP de primavera. Interceptor se basa en un proxy dinámico, utilizando la reflexión de lograr. Se primavera COI y otros componentes en el mismo ciclo de vida es controlado por el resorte, el interceptor se pueden inyectar en el depósito de granos de primavera COI otros procesos de negocio. Por supuesto, el interceptor puede también realizar el filtro Efectos filtro completo. Por lo tanto, más potente interceptor, también se recomienda el interceptor.
  • SpringMVC componentes web basadas en primavera, el procesamiento de solicitudes dinámica:. Sus clases básicas DispatcherServlet, se hace referencia comúnmente a un controlador de extremo frontal. Todas las solicitudes del cliente, la solicitud será enviada por el DispatcherServlet, de la que a continuación, devuelve una respuesta al contenedor de servlets. procedimiento operativo específico mostrado anteriormente, será interpretada por la fuente a continuación.

Filtro y la diferencia en la interpretación de las partes interceptoras Ya claro

Dos, filtro de filtro para su uso en el proyecto SpringBoot

proyectos muelle dispuesto filtro filtro original se configuran en web.xml. Sin SpringBoot archivo web.xml en el proyecto, pero la nueva configuración.

1, el modo de anotación

Hay dos formas de anotación del programa, de la siguiente manera:

  • @WebFilter+ @Component 或 @Configuration+ ( @OrderOpcional)
@Slf4j
@Order(2)
@Component
@WebFilter(urlPatterns="/*", filterName="filter2")
public class Filter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("{}初始化完成",this.getClass().getName());
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("{}执行过滤开始....",this.getClass().getName());
        filterChain.doFilter(servletRequest,servletResponse);
        log.info("{}执行过滤结束....",this.getClass().getName());
    }

    public void destroy() {
        log.info("{}销毁",this.getClass().getName());
    }
}
  • @WebFilter+ @ServletComponentScan("Filter所在包目录")+ ( @OrderOpcional)
@Slf4j
@Order(2)
@WebFilter(urlPatterns="/*", filterName="filter2")
public class Filter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("{}初始化完成",this.getClass().getName());
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("{}执行过滤开始....",this.getClass().getName());
        filterChain.doFilter(servletRequest,servletResponse);
        log.info("{}执行过滤结束....",this.getClass().getName());
    }

    public void destroy() {
        log.info("{}销毁",this.getClass().getName());
    }
}
@ServletComponentScan("com.mapc.j2ee.filter")
@SpringBootApplication
public class J2eeFilterInterceptorServletApplication {

    public static void main(String[] args) {
        SpringApplication.run(J2eeFilterInterceptorServletApplication.class, args);
    }

}

Añadir SpringBoot entrada de clase @ServletComponentScande anotación, o la adición de una clase personalizada FilterConfig @ServletComponentScan+ @Configurationcomposición anotaciones pueden.

2, la codificación

El uso FilterRegistrationBeande la inyección.

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean registerFilter1(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Filter1());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.setUrlPatterns(Collections.singleton("/*"));
        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean registerFilter2(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Filter2());
        filterRegistrationBean.setOrder(2);
        filterRegistrationBean.setUrlPatterns(Collections.singleton("/*"));
        return filterRegistrationBean;
    }

}

Tres, interceptor interceptor para su uso en proyectos SpringBoot

1, de herencia WebMvcConfigurationSupport+ @Configuration 或 @Componentnotas

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor1()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}
@Slf4j
@Order(2)
public class Interceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("{}请求处理前拦截",this.getClass().getName());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("{}请求处理后返回ModelAndView拦截",this.getClass().getName());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("{}请求处理后返回给前端视图拦截",this.getClass().getName());
    }
}

Cuatro, SpringMVC principio de funcionamiento Interpretación fuente

Hay complementada el tiempo


Referencias:
[1]: la Java Servlet 3.1 Especificación, "la especificación de Java Servlet 3.1" traducción y ejemplos
[2]: ¿Cuál es el contenedor de servlets?

Publicado 35 artículos originales · ganado elogios 32 · Vistas a 90000 +

Supongo que te gusta

Origin blog.csdn.net/u012995888/article/details/103398278
Recomendado
Clasificación