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

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

巴扎黑
Libérer: 2017-09-08 09:43:36
original
1380 Les gens l'ont consulté

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);
Copier après la connexion

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


 public void postHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler,
  ModelAndView modelAndView);
Copier après la connexion

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


 public void afterCompletion(HttpServletRequest request,
  HttpServletResponse response, Object handler, Exception ex)
Copier après la connexion

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 {   
  略。。。 
}
Copier après la connexion

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>
Copier après la connexion

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

<mvc:interceptors/> 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>
Copier après la connexion

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>
Copier après la connexion

Si vous utilisez <mvc:annotation-driven />, , 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 <mvc:annotation-driven />, puis injecter des intercepteurs dans l'attribut interceptors.

En fait, je ne recommande pas d'utiliser <mvc:annotation-driven />,, mais recommande plutôt d'écrire manuellement des fichiers de configuration détaillés au lieu de <mvc:annotation-driven />, ce qui vous donne un contrôle plus fort. Comment remplacer

par <mvc:annotation-driven /> ? Qu'a-t-il fait exactement ?

Une phrase <mvc:annotation-driven />En 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-->
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal