Maison  >  Article  >  Java  >  Introduction détaillée à l'intercepteur Spring MVC

Introduction détaillée à l'intercepteur Spring MVC

巴扎黑
巴扎黑original
2017-09-08 09:43:361320parcourir

L'intercepteur de Spring MVC est au niveau HandlerMapping. Il peut y avoir plusieurs HandlerMappings. Chaque HandlerMapping peut avoir son propre intercepteur

Spring nous fournit :

interface org.springframework.web.servlet.HandlerInterceptor,
adaptateur org.springframework.web.servlet.handler.HandlerInterceptorAdapter,

implémente cette interface ou hériter de cette classe la rend très pratique pour implémenter votre propre intercepteur.

a les trois méthodes suivantes :

Exécuté avant l'action :


 public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler);

Exécuter avant de générer la vue


 public void postHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler,
  ModelAndView modelAndView);

Enfin exécuté, peut être utilisé pour libérer des ressources


 public void afterCompletion(HttpServletRequest request,
  HttpServletResponse response, Object handler, Exception ex)

Implémenter respectivement le pré-traitement, le post-traitement (le service est appelé et renvoie ModelAndView, mais la page n'est pas rendue) et le traitement de retour (la page a été rendue)

Dans preHandle, le codage et la sécurité peuvent être effectués Contrôle et autres traitements ;

Dans postHandle, vous avez la possibilité de modifier ModelAndView

Dans afterCompletion, vous pouvez déterminer si une exception s'est produite et effectuer journalisation selon que ex est nul.

Le gestionnaire d'objet dans le paramètre est le prochain intercepteur.

Comment utiliser les intercepteurs ?

Personnaliser un intercepteur et implémenter l'interface HandlerInterceptor :

Le code Java


public class MyInteceptor implements HandlerInterceptor {   
  略。。。 
}

Spring MVC fait ne pas avoir d'intercepteur total et ne peut pas intercepter toutes les demandes avant et après.

L'intercepteur de Spring MVC est au niveau HandlerMapping. Il peut y avoir plusieurs HandlerMappings, et chaque HandlerMapping peut avoir son propre intercepteur.

Lorsqu'une requête exécute les classes d'implémentation de l'interface HandlerMapping séquentiellement en fonction de la valeur Order de petite à grande, selon la première éventualité, elle est terminée. Le HandlerMapping suivant ne disparaîtra pas et ce processus est terminé. . Passez simplement au processus suivant.

Quand l’intercepteur sera-t-il exécuté ? Lorsqu'une requête est transmise à un HandlerMapping, le HandlerMapping recherche d'abord un processeur pour gérer la requête. S'il le trouve, il exécute l'interception, puis le transmet au processeur cible.

Si aucun gestionnaire n'est trouvé, alors cet intercepteur ne sera pas exécuté.

Il existe trois façons de le configurer dans le fichier de configuration Spring MVC :

Option 1, intercepteur total (approximatif), intercepter toutes les URL

Code Java


  <mvc:interceptors> 
  <bean class="com.app.mvc.MyInteceptor" /> 
</mvc:interceptors>

Pourquoi est-il appelé « approximatif » Comme mentionné précédemment, Spring n'a pas d'intercepteur total ?

7e1c76f056e5a23401b3d31dc10adfa0 injectera un intercepteur pour chaque HandlerMapping. Il y a toujours un HandlerMapping qui peut trouver le processeur, et au plus un seul processeur peut être trouvé, donc cet intercepteur sera toujours exécuté. Agit comme un intercepteur total.

S'il s'agit d'une URL de style REST, les ressources statiques seront également interceptées.

Option 2, intercepteur total (approximatif), intercepte les URL correspondantes.

Le code XML


<mvc:interceptors >  
 <mvc:interceptor>  
    <mvc:mapping path="/user/*" /> <!-- /user/* -->  
    <bean class="com.mvc.MyInteceptor"></bean>  
  </mvc:interceptor>  
</mvc:interceptors>

est une correspondance d'URL de plus que l'option 1.

S'il s'agit d'une URL de style REST, les ressources statiques seront également interceptées.

Option 3, intercepteur sur HandlerMappint.

S'il s'agit d'une URL de style REST, les ressources statiques ne seront pas interceptées. Parce que nous avons injecté l'intercepteur avec précision.

Code XML


<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">    
 <property name="interceptors">    
   <list>    
     <bean class="com.mvc.MyInteceptor"></bean>   
   </list>    
 </property>    
</bean>

Si vous utilisez 463d7d566f84e66ad507872587b9c14c, , il enregistrera automatiquement les deux beans DefaultAnnotationHandlerMapping et AnnotationMethodHandlerAdapter, il n'y aura donc aucune chance pour le redonner Il injecte l'attribut intercepteurs, donc l'intercepteur ne peut pas être spécifié.

Bien sûr, nous pouvons configurer manuellement les deux beans ci-dessus sans utiliser 463d7d566f84e66ad507872587b9c14c, puis injecter des intercepteurs dans l'attribut interceptors.

En fait, je ne recommande pas d'utiliser 463d7d566f84e66ad507872587b9c14c,, mais recommande plutôt d'écrire manuellement des fichiers de configuration détaillés au lieu de 463d7d566f84e66ad507872587b9c14c, ce qui vous donne un contrôle plus fort. Comment remplacer

par 463d7d566f84e66ad507872587b9c14c ? Qu'a-t-il fait exactement ?

Une phrase 463d7d566f84e66ad507872587b9c14cEn fait, nous avons effectué le travail suivant : (à l'exclusion de l'ajout de votre propre intercepteur défini)

Après avoir compris cela, nous avons plus de contrôle sur Spring3 MVC et souhaitons le modifier n'importe où tu vas.

Code XML


 <!-- 注解请求映射 --> 
  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">     
  <property name="interceptors"> 
    <list>  
      <ref bean="logNDCInteceptor"/>  <!-- 日志拦截器,这是你自定义的拦截器 --> 
      <ref bean="myRequestHelperInteceptor"/>  <!-- RequestHelper拦截器,这是你自定义的拦截器-->  
      <ref bean="myPermissionsInteceptor"/> <!-- 权限拦截器,这是你自定义的拦截器-->  
      <ref bean="myUserInfoInteceptor"/> <!-- 用户信息拦截器,这是你自定义的拦截器-->  
    </list>     
  </property>     
</bean>   
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
  <property name="messageConverters">  
    <list>  
      <ref bean="byteArray_hmc" />  
      <ref bean="string_hmc" />  
      <ref bean="resource_hmc" />  
      <ref bean="source_hmc" />  
      <ref bean="xmlAwareForm_hmc" />  
      <ref bean="jaxb2RootElement_hmc" />  
      <ref bean="jackson_hmc" />  
    </list>  
  </property>  
</bean>  
<bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /><!-- 处理.. --> 
<bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter" /><!-- 处理.. --> 
<bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="xmlAwareForm_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jaxb2RootElement_hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /><!-- 处理json-->

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