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 ?
<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>
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 <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-->
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!