[SpringMVC] Tres intercepciones para un interceptor de ida y vuelta

El papel de Interceptor

El interceptor de SpringMVC es similar al filtro en el desarrollo de Servlet, y su función es preprocesar y postprocesar el procesador .

Los interceptores se definen conectados secuencialmente en una cadena, referidos a la cadena de interceptores (Cadena de interceptores).

El objetivo del interceptor es el método comercial del controlador; en realidad, esta es otra encarnación de la idea de AOP.

 

La diferencia entre interceptor y filtro

la diferencia filtrar Interceptador
Alcance de uso Es parte de la especificación de Servlet y se puede utilizar siempre que sea un proyecto JavaWeb. Es exclusivo del marco Spring MVC
Rango de intercepción Interceptar todos los recursos dinámicos / recursos estáticos (asumiendo que el patrón de URL está configurado como / *) Solo interceptar métodos de controlador (entendidos como recursos dinámicos), no jsp, js, css, img, etc. (recursos estáticos)

 

Inicio rápido

① Cree un interceptor e implemente la interfaz HandlerInterceptor

public class MyInterceptor1 implements HandlerInterceptor {
    
    

    // 在目标方法执行之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle...");
        return true;
    }

    // 在目标方法执行之后、视图返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...");
    }

    // 视图返回之后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion..");
    }
}

② Configure el interceptor (estaba configurado en spring-mvc.xml en ese momento)

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 对哪个资源执行哪个拦截器 -->
        <mvc:mapping path="/**"/>
        <bean class="com.samarua.interceptor.MyInterceptor1" />
    </mvc:interceptor>
</mvc:interceptors>

③ Pruebe el efecto de interceptación

@Controller
public class TargetController {
    
    

    @RequestMapping("/target")
    public ModelAndView show() {
    
    
        System.out.println("业务逻辑正在执行>_<...");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name", "Alice");
        modelAndView.setViewName("hello.jsp");
        return modelAndView;
    }
}

Inserte la descripción de la imagen aquí

 
 

Inicio rápido detallado

Comprenda y recuerde:

preHandle () Se llama antes de que se ejecute el método de destino. Cuando el valor de retorno es falso, la cadena se rompe directamente y termina, y generalmente se transferirá a otros recursos; cuando el valor de retorno es verdadero, el siguiente Interceptor o Controlador procederá. También se puede decir que la devolución de true por preHandle () de este interceptor es una condición previa para la ejecución de postHandle () y afterCompletion () de este interceptor. (Vea la imagen a continuación para comprender)
postHandle () Se llama después de que se ejecuta el método de destino y antes de que vuelva la vista. Los parámetros de este método incluyen el objeto ModelAndView, por lo que se puede modificar antes de que el objeto ModelAndView esté a punto de regresar.
afterCompletion () Llamado después de que vuelva la vista. También se puede decir que se llama después de que han finalizado todos los procesos.

La siguiente imagen es muy útil para comprender:

Inserte la descripción de la imagen aquí

 
Lea el siguiente código para experimentar el propósito de estos tres métodos en el interceptor:

public class MyInterceptor2 implements HandlerInterceptor {
    
    

    // 在目标方法执行之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("我可以决定这个拦截器链是否能继续执行...");
        String allow = request.getParameter("allow");
        if(allow.equals("yes")) {
    
    
            return true;
        } else {
    
    
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return false;
        }
    }

    // 在目标方法执行之后、视图返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("我可以偷偷修改ModelAndView对象...");
        modelAndView.addObject("username", "Hana");
    }

    // 视图返回之后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("我几乎没什么作用...");
    }
}

 
 
 
 

 
 
 
 

 
 
 
 

Más> _ <

Supongo que te gusta

Origin blog.csdn.net/m0_46202073/article/details/114375429
Recomendado
Clasificación