Spring Web MVC de Spring Family Bucket (7) - Intercepteur

Prenez l'habitude d'écrire ensemble ! C'est le 11ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .

1. Intercepteur

Spring MVC fournit un mécanisme d'interception qui permet un certain travail d'interception avant l'exécution de la méthode cible, ou un autre traitement après l'exécution de la méthode cible.

L'intercepteur dans Spring MVC est l'interface HandlerInterceptor, qui contient trois méthodes

image.png

  • preHandler : cette méthode est appelée avant que le processeur métier ne traite la demande. Dans cette méthode, la demande de l'utilisateur est traitée. Si l'intercepteur doit intercepter la demande, d'autres intercepteurs seront appelés ou le processeur métier sera traité. Puis retour Vrai pour libérer la requête, et renvoie faux s'il n'est pas nécessaire d'appeler d'autres composants, ni de libérer la requête
  • postHandler : cette méthode est appelée une fois que le processeur métier a fini de traiter la demande, mais elle est appelée avant que le DispatcherServlet ne renvoie une réponse au client. Dans cette méthode, la demande de l'utilisateur est traitée
  • afterCompletion : cette méthode est appelée après que le DispatcherServlet a complètement traité la demande, et certaines opérations de nettoyage des ressources peuvent être effectuées dans cette méthode

Deuxièmement, l'intercepteur personnalisé

Copiez le projet spring-mvc-ajax, renommez-le en spring-mvc-handler et supprimez les classes et les fichiers à l'exception de la configuration.

Le flux normal de l'intercepteur

Créez un nouveau HandlerInterceptorSamplerController, définissez la méthode d'intercepteur dans le contrôleur, testez l'intercepteur personnalisé et revenez à la page de réussite

@Controller
public class HandlerInterceptorSamplerController {

    @RequestMapping("/interceptor")
    public String interceptor(){

        System.out.println("interceptor方法被调用");
        return "success";
    }
}
复制代码

Ajouter un lien hypertexte vers la page index.jsp

<a href="/interceptor">拦截该请求</a>
复制代码

Ajoutez le package d'intercepteur, créez un nouvel intercepteur personnalisé ZuluInterceptor, l'intercepteur personnalisé doit implémenter l'interface HandlerInterceptor et ajouter l'impression du journal à chaque méthode de l'intercepteur

public class ZuluInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println(this.getClass().getName() + " preHandler方法运行了");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(this.getClass().getName() + " postHandle方法运行了");
        System.out.println(modelAndView.getViewName());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(this.getClass().getName() + " afterCompletion方法运行了");
    }
}
复制代码

Enregistrez l'intercepteur dans le fichier de configuration Spring MVC et configurez les demandes que l'intercepteur intercepte

<mvc:interceptors>
    <!--第一种方式配置某个拦截器,默认是拦截所有请求的-->
    <bean class="com.citi.interceptor.ZuluInterceptor"></bean>
</mvc:interceptors>
复制代码

Démarrez l'application et cliquez sur le lien hypertexte sur la page d'accueil

image.pngSelon la sortie de la console, l'intercepteur personnalisé est appelé avec succès

因此拦截器的正常流程是:拦截器preHandler方法 -> 目标方法 -> 拦截器的postHandler方法 -> 页面渲染 -> 拦截器的afterCompletion方法

拦截器的异常流程

异常流程1 - preHandler返回false

在ZuluInterceptor拦截器的preHandler方法返回false,再次启动,点击首页的超链接 image.png 控制台只输出了preHandler方法的执行信息,因此只要preHandler返回false,既不放行就不会有以后的方法的执行。

异常流程2 - 其他异常

保持preHandler方法返回true,同时在Controller中的interceptor方法返回页面前增加异常代码

@RequestMapping("/interceptor")
public String interceptor(){

    System.out.println("interceptor方法被调用");
    // 异常代码
    int i = 10 / 0;
    return "success";
}
复制代码

再次重新启动应用,点击页面的超链接 image.png 页面出现有异常代码导致的报错

image.png 此时控制台执行了afterCompletion方法

三、多个拦截器执行顺序

在interceptor包中拷贝ZuluInterceptor并重命名为DeltaInterceptor;在Spring MVC配置文件中注册新定义的拦截器

<mvc:interceptors>
    <!--第一种方式配置某个拦截器,默认是拦截所有请求的-->
    <bean class="com.citi.interceptor.ZuluInterceptor"></bean>
    <bean class="com.citi.interceptor.DeltaInterceptor"></bean>
</mvc:interceptors>
复制代码

将Controller中的interceptor方法中的异常代码注销,重新启动,点击页面的插连接

image.png 根据控制台的输出可以确定,限制性了Zulu拦截器中的preHandler方法,接着执行Delta拦截器的preHandler方法,再执行目标方法,接着调用Delta拦截器的postHandler,再执行Zulu拦截器的postHandler,再执行Delta拦截器的afterCompletion方法,最后再执行Zulu拦截器的afterCompletion方法

拦截顺序: 拦截器拦截顺序是按照配置的先后顺序,调整拦截器配置顺序

<mvc:interceptors>
    <!--第一种方式配置某个拦截器,默认是拦截所有请求的-->
    <bean class="com.citi.interceptor.DeltaInterceptor"></bean>
    <bean class="com.citi.interceptor.ZuluInterceptor"></bean>
</mvc:interceptors>
复制代码

Recommencez et cliquez sur le lien hypertexte sur la page d'accueil. image.pngSelon la sortie de la console, l'intercepteur Delta configuré en premier dans le fichier de configuration est exécuté en premier.

Flux d'exception de plusieurs intercepteurs :

Conservez l'intercepteur Delta en premier et l'intercepteur Zulu en dernier dans le fichier de configuration Spring MVC. Si l'intercepteur Delta n'est pas libéré, il n'y aura pas d'appels ultérieurs ; si l'intercepteur Zulu n'est pas libéré, quel sera le résultat ?

Renvoyez false dans l'intercepteur Zulu, redémarrez l'application et cliquez sur le lien hypertexte vers la page d'accueil

image.pngSelon la sortie de la console, il peut être déterminé que l'intercepteur Zulu ne sera pas libéré, mais la méthode afterCompletion de Delta sera toujours exécutée.

已放行了的拦截器的afterCompletion方法总会执行

Je suppose que tu aimes

Origine juejin.im/post/7085374517136064542
conseillé
Classement