Maison  >  Article  >  Java  >  Explorez le principe de mise en œuvre de l'intercepteur Spring

Explorez le principe de mise en œuvre de l'intercepteur Spring

王林
王林original
2024-01-11 15:18:23587parcourir

Explorez le principe de mise en œuvre de lintercepteur Spring

Révéler le mécanisme d'implémentation de Spring interceptor

Introduction

Lors du développement d'applications Web, nous devons souvent effectuer certaines opérations avant ou après que la requête atteigne le contrôleur. Par exemple, authentifier les utilisateurs, enregistrer les journaux, gérer les exceptions, etc. Le framework Spring nous fournit des intercepteurs (Intercepteurs) pour implémenter ces opérations. Les intercepteurs peuvent pré-traiter et post-traiter les demandes et les réponses.

Cet article approfondira le mécanisme de mise en œuvre de l'intercepteur Spring. Nous comprendrons ce que sont les intercepteurs, comment ils fonctionnent et démontrerons comment implémenter des intercepteurs personnalisés à travers des exemples de code spécifiques.

Le concept d'intercepteur

Interceptor est un mécanisme du framework Spring pour les requêtes de pré- et post-traitement. C'est similaire aux filtres des servlets, mais contrairement aux filtres, les intercepteurs sont basés sur le niveau de la méthode. Il peut intercepter les méthodes dans le contrôleur spécifié et exécuter une logique personnalisée avant et après l'exécution de la méthode. Les intercepteurs peuvent nous aider à mettre en œuvre un traitement général qui n'a rien à voir avec la logique métier et à améliorer la réutilisabilité et la maintenabilité du code.

Comment fonctionne l'intercepteur

L'intercepteur est implémenté via AOP (Aspect Oriented Programming). L'intercepteur Spring est basé sur l'interface HandlerInterceptor, qui définit trois méthodes : preHandle, postHandle et afterCompletion. Le flux de travail spécifique est le suivant :

  1. Lorsque le client envoie une requête à DispatcherServlet, DispatcherServlet trouvera le HandlerMapping correspondant en fonction de l'URL demandée et obtiendra le HandlerExecutionChain correspondant.
  2. HandlerExecutionChain contient une série de HandlerInterceptor.
  3. DispatcherServlet appellera tour à tour la méthode preHandle de chaque intercepteur et vérifiera la valeur de retour de la méthode.

    • Si true est renvoyé, la requête continue le traitement et entre dans la méthode preHandle du prochain intercepteur.
    • Si false est renvoyé, la demande sera interrompue ici et renvoyée au client.
  4. Lorsque les méthodes preHandle de tous les intercepteurs renvoient vrai, DispatcherServlet appellera la méthode handleRequest de l'objet Handler dans HandlerExecutionChain.
  5. L'objet Handler dans HandlerExecutionChain exécute la logique métier et renvoie ModelAndView.
  6. DispatcherServlet appellera tour à tour la méthode postHandle de chaque intercepteur et leur transmettra le ModelAndView.
  7. La méthode postHandle de l'intercepteur peut modifier et améliorer ModelAndView.
  8. DispatcherServlet transmet ModelAndView à ViewResolver pour l'analyse et le rendu de la vue.
  9. Une fois la vue rendue, DispatcherServlet appellera tour à tour la méthode afterCompletion de chaque intercepteur pour nettoyer davantage certaines ressources.

Implémentation d'un intercepteur personnalisé

Ce qui suit utilise un exemple spécifique pour montrer comment implémenter un intercepteur personnalisé.

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //  在方法执行之前进行逻辑处理
        System.out.println("拦截器preHandle方法执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在方法执行之后进行逻辑处理
        System.out.println("拦截器postHandle方法执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后进行逻辑处理
        System.out.println("拦截器afterCompletion方法执行");
    }
}

Dans le code ci-dessus, nous avons implémenté l'interface HandlerInterceptor et remplacé trois de ses méthodes. Dans la méthode preHandle, nous pouvons effectuer un prétraitement ; dans la méthode postHandle, nous pouvons modifier et améliorer ModelAndView ; dans la méthode afterCompletion, nous pouvons effectuer certaines opérations de nettoyage des ressources.

Ensuite, nous devons configurer l'intercepteur personnalisé dans le conteneur Spring. Ceci peut être réalisé via une configuration XML ou des annotations.

Méthode de configuration XML

Ajoutez la configuration suivante dans le fichier de configuration Spring :

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login" />
        <bean class="com.example.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

Dans la configuration ci-dessus, nous utilisons la balise <interceptor></interceptor> pour définir l'intercepteur, et passons spécifie le chemin de l'URL à intercepter. Utilisez la balise <exclude-mapping></exclude-mapping> pour exclure certains chemins d'URL qui n'ont pas besoin d'être interceptés. <interceptor></interceptor>标签来定义拦截器,并通过<mapping></mapping>标签指定要拦截的URL路径。使用<exclude-mapping></exclude-mapping>标签来排除一些不需要拦截的URL路径。

注解方式配置拦截器

在拦截器类上添加@Component注解,并使用@Order

Configurez l'intercepteur à l'aide d'annotations

Ajoutez l'annotation @Component à la classe d'intercepteur et utilisez l'annotation @Order pour spécifier l'ordre d'exécution de l'intercepteur.

@Component
@Order(1)
public class MyInterceptor implements HandlerInterceptor {
    // 省略代码
}

Ajoutez la configuration suivante dans la classe de configuration de Spring :

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

Dans la configuration ci-dessus, nous ajoutons l'intercepteur au registre des intercepteurs en implémentant l'interface WebMvcConfigurer et en y réécrivant la méthode addInterceptors.

Conclusion🎜🎜À travers cet article, nous avons compris le concept et le principe de fonctionnement des intercepteurs Spring, et avons démontré comment implémenter des intercepteurs personnalisés à travers des exemples de code spécifiques. Les intercepteurs sont une fonctionnalité très importante du framework Spring, qui peut nous aider à implémenter une logique de traitement commune et à améliorer la réutilisabilité et la maintenabilité du code. J'espère que cet article vous a été utile pour comprendre les intercepteurs Spring. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn