Resumen de aprendizaje de Spring MVC (9): interceptores y manejo de excepciones

1. Interceptor

1. Introducción a los interceptores

El Interceptor de Spring MVC es similar al Filtro de Java Servlet. Se usa principalmente para interceptar las solicitudes de los usuarios y realizar el procesamiento correspondiente. Por lo general, se usa para la verificación de permisos, el registro de información de solicitudes y juzgar si el usuario está conectado, etc. .Funcionalmente. Definir un interceptor en el marco Spring MVC requiere la definición y configuración del interceptor. Hay dos formas de definir un interceptor: una se define mediante la implementación de la interfaz HandlerInterceptor o la clase de implementación que hereda la interfaz HandlerInterceptor; la otra es a través de Definir por implementar la interfaz WebRequestInterceptor o heredar la clase de implementación de la interfaz WebRequestInterceptor. Este artículo lo demuestra de la segunda forma.

Hay tres métodos en HandlerInterceptor, que se describen a continuación:

  • Método preHandle: este método se ejecuta antes del método de solicitud de procesamiento del controlador, y su valor de retorno indica si interrumpir las operaciones posteriores, devolver verdadero para continuar con la ejecución descendente y falso para interrumpir las operaciones posteriores.
  • Método postHandle: este método se ejecuta después de llamar al método de procesamiento de solicitudes del controlador y antes de que se resuelva la vista. Este método se puede utilizar para modificar aún más el modelo y la vista en el dominio de solicitud.
  • Método afterCompletion: este método se ejecuta después de que se ejecuta el método de solicitud de procesamiento del controlador, es decir, se ejecuta después de que finaliza la visualización de la vista.Este método se puede usar para limpiar algunos recursos y registrar información de registro.

La diferencia entre el interceptor y el filtro es la siguiente:

  Filtrar Interceptador
Diferente ámbito de uso De acuerdo con la especificación de Servlet, solo se puede usar en programas web Se puede utilizar en programas web, pero también en programas Applicaiont y Swing.
Diferentes especificaciones Un complemento a la especificación de Servlet, que puede ser utilizado por cualquier proyecto web Spring Framework, solo se pueden usar proyectos que usan Spring MVC Framework
Diferentes recursos utilizados El filtro no funciona

El interceptor es un componente de Spring, administrado por Spring, configurado en el archivo Spring, y puede usar cualquier recurso y objeto en Spring, como objeto de servicio, fuente de datos, administración de transacciones, etc.

Diferente profundidad El filtro solo funciona antes y después del servlet. Los interceptores pueden profundizar en los métodos de antes y después, antes y después de que se lanzan las excepciones, y tienen una mayor flexibilidad.
Diferentes recursos interceptados Después de configurar / * en el patrón de URL, el filtro bloqueará todos los recursos a los que se puede acceder El interceptor solo intercepta el acceso al método del controlador, si el acceso es jsp, html, css, image, js, etc., no será interceptado

 

2. El proceso de ejecución de un solo interceptor

Si solo se define un interceptor en el archivo de configuración, el programa primero ejecutará el método preHandle en la clase del interceptor. Si el método devuelve verdadero, el programa continuará ejecutando el método de procesamiento de la solicitud en el controlador; de lo contrario, la ejecución será ser interrumpido. Si el método preHandle devuelve verdadero y se ejecuta el método de procesamiento de la solicitud en el controlador, el método postHandle se ejecutará antes de que se devuelva la vista y el método afterCompletion se ejecutará después de que se devuelva la vista.

(1) Configurar web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!--  指定Spring MVC配置文件的位置    -->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!--   字符编码过滤器  -->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--  encoding:指定一个具体的字符集  -->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <!-- forceEncoding:处理 response中的字符编码  -->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>

  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


</web-app>

(2) Cree una clase de controlador

@Controller
public class InterceptorController {
    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("我是testInterceptor方法");
        return "interceptorPage";
    }
}

(3) Cree una clase de interceptor

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("我是preHandle方法---在控制器的处理请求方法调用之后,解析视图之前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("我是postHandle方法---在控制器的处理请求方法调用之后,解析视图之前执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("我是afterCompletion方法---在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
    }
}

(4) Configure la clase de interceptor en springmvc.xml 

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 配置一个全局拦截器,拦截所有请求 -->
        <mvc:interceptor>
            <!-- 配置拦截器作用的路径 -->
            <mvc:mapping path="/**" />
            <!-- 配置不需要拦截作用的路径 -->
<!--            <mvc:exclude-mapping path="" />-->
            <!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
            <bean class="com.yht.example1.interceptor.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

En el código de muestra anterior, el elemento <mvc: interceptors> se usa para configurar un conjunto de interceptores, y su elemento secundario <bean> define un interceptor global, es decir, intercepta todas las solicitudes.

El elemento <mvc: interceptor> define el interceptor de la ruta especificada, y su elemento secundario <mvc: mapping> se utiliza para configurar la ruta del interceptor, que se define en su ruta de atributo.

Como en el código de ejemplo anterior, el valor de atributo de la ruta "/ **" significa bloquear todas las rutas y "/ **" significa bloquear todas las rutas. Si la ruta de la solicitud contiene contenido que no necesita ser interceptado, se puede configurar a través del subelemento <mvc: exclude-mapping>.

Cabe señalar que los elementos secundarios del elemento <mvc: interceptor> deben configurarse en el orden de <mvc: mapping ... />, <mvc: exclude-mapping ... />, <bean ... />. 

(5) Crear interceptorPage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
视图
<%System.out.println("视图渲染结束。"); %>
</body>
</html>

(6) Inicie el servidor Tomcat y luego pruebe el interceptor a través de la dirección " http: // localhost: 8080 / SpringMVCStudy02_war / testInterceptor ". El resultado es el siguiente:

3. El proceso de ejecución de múltiples interceptores

En las aplicaciones web, generalmente se requiere que varios interceptores funcionen al mismo tiempo. En este momento, sus métodos preHandle se ejecutarán en el orden de configuración de los interceptores en el archivo de configuración, y sus métodos postHandle y afterCompletion se ejecutarán en el orden inverso al orden de configuración. Como se muestra abajo:

(1) Cree la clase de interceptor TestInterceptor.

public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("我是preHandle方法---TestInterceptor类");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("我是postHandle方法---TestInterceptor类");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("我是afterCompletion方法---TestInterceptor类");
    }
}

(2) Configure TestInterceptor en springmvc.xml.

<!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 配置拦截器作用的路径 -->
            <mvc:mapping path="/**" />
            <bean class="com.yht.example1.interceptor.MyInterceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <!-- 配置拦截器作用的路径 -->
            <mvc:mapping path="/**" />
            <bean class="com.yht.example1.interceptor.TestInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

(3) Inicie el servidor Tomcat y luego pruebe el interceptor a través de la dirección " http: // localhost: 8080 / SpringMVCStudy02_war / testInterceptor ". El resultado es el siguiente:

Nota:

Si se devuelve falso en preHandle, significa que no hay liberación. En este momento, podemos usar request.getRequestDispatcher ("/ WEB-INF / pages / page name"). Forward (request, response); para saltar a una página. 

Dos, manejo de excepciones

En el desarrollo de aplicaciones Spring MVC, no importa si es el funcionamiento de la base de datos subyacente, o el funcionamiento de la capa empresarial o la capa de control, inevitablemente encontrará varias excepciones predecibles e impredecibles que deben tratarse. La interfaz HandlerExceptionResolver se utiliza para resolver las excepciones generadas durante el procesamiento de solicitudes.

(1) La clase de excepción personalizada SystemException.

public class SystemException extends Exception{
    private String message;

    public SystemException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

(2) Cree error.jsp en las páginas.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>这是错误页面</h4>
${msg}
</body>
</html>

(3) Cree un SystemExceptionHandler que implemente la interfaz HandlerExceptionResolver

public class SystemExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        SystemException systemException = null;
        if(e instanceof  SystemException){
            systemException = (SystemException) e;
        }else{
            e = new SystemException("系统异常");
        }
        ModelAndView mv = new ModelAndView();
        mv.setViewName("error");
        mv.addObject("msg", e.getMessage());
        return mv;
    }
}

(4) Crea un controlador

@Controller
public class ExceptionController {
    @RequestMapping("/testException")
    public String testException() throws Exception{
        System.out.println("我是testException方法");
        int num = Integer.parseInt("a123");
        return "success";
    }
}

(5) Configure SystemExceptionHandler en springmvc.xml

    <bean class="com.yht.example1.handler.SystemExceptionHandler"></bean>

(6) Inicie el servidor Tomcat y luego pruebe el interceptor a través de la dirección " http: // localhost: 8080 / SpringMVCStudy02_war / testException ". Los resultados de la interfaz son los siguientes:

Supongo que te gusta

Origin blog.csdn.net/weixin_47382783/article/details/113615558
Recomendado
Clasificación