Cet article présente principalement l'intercepteur SpringMVC, comme suit:
1.Dispatcherservlet
SpringMVC a un Dispatcherservlet d'entrée unifié et toutes les demandes passent par Dispatcherservlet.
DispatcherServlet est un pré-contrôleur configuré dans le fichier web.xml. Pour intercepter les demandes de correspondance, les règles de correspondance d'interception du servlet doivent être définies par elle-même et les demandes interceptées doivent être distribuées au contrôleur cible en fonction de certaines règles de traitement. Nous ajoutons donc maintenant la configuration suivante à web.xml:
<! - Lors de l'initialisation du Dispatcherservlet, le framework recherche un fichier nommé [servlet-name] -servlet.xml dans le répertoire Web de l'application Web, et définit les beans pertinents là-bas, dépassant tous les beans définis globalement -> <Servlet> <Servlet-name> SpringMybatis </servlet-name> <Serplet-Class> org.springframework.web.servlet.dispatcherServlet </vrlet-class> <onde-on-startup> 1 </ load-on-startup> </vrlet> <servlet-mapping> <sterlet-name> Springmybatis </ servlet-name> <! - Toutes les demandes seront traitées par Dispatcherservlet -> <url-Pattern> </ serflet-mapping>
2. Les ressources statiques n'interagissent pas
Si vous configurez uniquement l'interception des URL similaires au format * .do, il n'y a aucun problème à accéder aux ressources statiques. Cependant, si la configuration intercepte toutes les demandes (telles que "/" que nous avons configurées ci-dessus), cela entraînera inaccessible des ressources statiques telles que les fichiers JS, les fichiers CSS et les fichiers photo.
Généralement, l'intercepteur est principalement mis en œuvre pour la gestion de l'autorisation, interceptant principalement certaines demandes d'URL, de sorte que les ressources statiques ne sont pas interceptées. Il existe généralement deux façons de filtrer les ressources statiques.
La première consiste à utiliser <MVC: par défaut-service-handler /> (généralement, le nom de servlet par défaut du serveur d'applications Web est "par défaut", nous activons donc ici Tomcat defaultServlet pour traiter les fichiers statiques et configurons le code suivant dans web.xml :)
<! - Le servlet est fourni pour des conteneurs tels que Tomcat, jetée, etc., et modifie la cartographie des ressources statiques de / à / statique / répertoire. Par exemple, lorsque vous avez visité http: //localhost/foo.css, maintenant http: //localhost/static/foo.css -> <! - N'interceptez pas les fichiers statiques -> <servlet mapping> <servlet-Name> par défaut </ servlet-name> <Url-Pattern> / js / * </url-stattern> <url-potern> / css / * </ url-potern> <url-potern> / images / * </ url-potern> <url-potern> / fonts / * </ url-potern> </ servlet-mapping>
Tomcat, Jetty, Jboss et Glassfish le nom du servlet par défaut - "par défaut"
Résine le nom du servlet par défaut --- "résine-fichier"
Nom du servlet par défaut WebLogic - "Fileservlet"
Nom du servlet par défaut de WebSphere - "SimpleFileservlet"
Si le nom de servlet par défaut de tous vos serveurs d'applications Web n'est pas "par défaut", vous devez afficher la propriété spécifiée via la propriété de nom de service par défaut:
<MVC: default-servlet-handler default-servlet-name = "Le nom du servlet utilisé par le serveur Web par défaut" />
Le deuxième type consiste à utiliser <MVC: Resources /> et à ajouter le code suivant au fichier de configuration de SpringMVC:
<mvc: Ressources mapping = "/ js / **" location = "/ static_resources / javascript /" /> <mvc: Resources mapping = "/ styles / **" location = "/ static_resources / css /" /> <mvc: ressources mapping = "/ images / **" location = "/ static_resources / images /" /> "
3. Intercepteur personnalisé
Le gestionnaire intercepteur de SpringMVC, le gestionnaire de l'Interceptor, fournit trois méthodes de pré-hanche, de post-main et de récomplétion. Prehandle est appelé avant que le processeur de service ne traite la demande,
PostHandle est exécuté après que le processeur d'entreprise a terminé l'exécution de la demande et a généré la vue. Aftercompletion est appelé après que DispatcherServlet a complètement traité la demande et peut être utilisé pour nettoyer les ressources, etc.
Tout d'abord, ajoutez mon propre intercepteur défini à Springmvc.xml. Ma logique d'implémentation CommonInterceptor.
<! - Configurez les intercepteurs, plusieurs intercepteurs, exécutez séquentiellement -> <mvc: intercepteurs> <mvc: interceptor> <! - correspond au chemin d'URL. Si vous ne configurez pas ou / **, tous les contrôleurs seront interceptés -> <mvc: mapping path = "/ user / **" /> <mvc: mapping path = "/ test / **" /> <ean> </ bean> </ mvc: interceptor> <! - lors de la configuration des intercepteurs multiples, appelez d'abord la méthode de pré-altitude dans la séquence, et ensuite appelez la méthode complémentaire et après la méthode d'intervalle de séquence, et ensuite Dans l'ordre inverse -> </ mvc: intercepteurs>
Ma logique d'interception est "Avant la connexion, toute URL d'accès passe à la page de connexion; une fois la connexion réussie, passez à l'URL précédente", le code spécifique est le suivant:
/ ** * * / package com.alibaba.interceptor; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.web.servlet.modelandView; import org.springframework.web.servlet.handler.handlerInterceptorAdapter; import com.alibaba.util.requesttutil; / ** * @author tfj * 2014-8-1 * / public class CommonInterceptor étend HandlerInterceptorAdapter {private final logger log = loggerfactory.getLogger (CommonInterceptor.class); Public Static Final String last_page = "com.alibaba.lastpage"; / * * Utilisez un mappage régulier sur le chemin qui doit être intercepté un mappingurl de chaîne privé; public void setMappingUrl (String MappingUrl) {this.mappingUrl = mappingUrl; } * / / ** * appelé avant que le processeur commercial ne gère la demande * Si false est renvoyé * Exécutez tous les intercepteurs des intercepteurs () à partir de l'intercepteur actuel, puis quittez la chaîne d'intercepteur * Si vrai * exécutez le prochain intercepteur jusqu'à ce que tous les intercepteurs aient été exécutés * Exécuter le contrôleur intercepteur * puis entrez la chaîne interceptrice, * exécuter tous les avant PostCompletion () From the Last Interceptor * / @Override public Boolean Prehandle (HttpServLetRequest Request, HttpservletResponse Response, Object Handler) lève une exception {if ("get" .equalSignoreCase (request.getMethod ())) {requestUtil.SaverElest (); } log.info ("============= 执行顺序: 1 、 prehandle ==============="); String requestUri = request.getRequeSturi (); String contextPath = request.getContextPath (); String url = requestUri.substring (contextPath.length ()); log.info ("requestUri:" + requestUri); Log.info ("ContextPath:" + ContextPath); Log.info ("URL:" + URL); String username = (string) request.getSession (). GetAttribute ("utilisateur"); if (username == null) {log.info ("interceptor: sauter à la page de connexion!"); request.getRequestDispatcher ("/ web-inf / jsp / login.jsp"). Forward (demande, réponse); retourne false; } else return true; } / ** * Une fois le processeur commercial terminé le traitement de la demande, l'action exécutée avant la génération de la vue * Vous pouvez ajouter des données au ModelandView, telles que l'heure actuelle * / @Override public void Posthandle (HttpServletRequest Request, HttpservletResponse Response, Object Handler, ModelView ModelandView) lance exception { Log.info ("===========================================================================================================================================================================================================. log.info("========================================================================================== =======================================================================================================. ========================================================================================================================. =======================================================================================================. Réponse, gestionnaire d'objets, exception ex) lève une exception {log.info ("============= 执行顺序: 3 、 AfterCompletion ==============="); Remarque: Dans le code ci-dessus, j'ai écrit une demandeUtil, qui implémente principalement des fonctions telles que l'obtention de la demande actuelle, l'objet de session, l'enregistrement et le chiffrement des pages et la sortie.
À ce stade, l'intercepteur a été mis en œuvre et l'effet est comme indiqué sur la figure:
Je serai bloqué en visitant / test / bonjour directement
Après avoir enregistré avec succès, il sautera sur la page correspondant à / test / bonjour
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.