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;
}
}
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:
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("我几乎没什么作用...");
}
}