1. Présentation
Les intercepteurs sont de plus en plus utilisés, surtout après la popularité de la programmation des tranches. Alors, que peut faire un intercepteur?
Dans notre introduction à l'agent, nous avons mentionné que l'appel des fonctions statistiques prend du temps. Cette idée est en fait exactement la même que l'amélioration du surround de l'AOP.
D'une manière générale, le scénario est le suivant:
Et d'autres et ainsi de suite.
2. Intercepteur du printemps
Qu'il s'agisse de SpringMVC ou Springboot, nous devons mentionner l'intercepteur:
org.springframework.web.servlet.handler.handlerInterceptorAdapter
Public Abstract Classe HandlerInterceptorAdapter implémente asynchandlerInterceptor {// exécuter @Override public booléen prehandle (httpservletRequest request, httpservletResponse réponse, objet handler) lève exception {return true; } // Exécuter après l'exécution de la méthode cible, mais avant le retour de la demande, nous pouvons toujours modifier la demande ModelandView @Override public void Posthandle (HttpServletRequest Request, HttpservletResponse Response, Object Handler, ModelView ModelandView) lance Exception {} // Exécuter @Override Public Void After Ompletion (HTTPSERVEST CONDITION, HttpServletResponse Response, Handler d'objet, exception ex) lève une exception {} // utilisée pour gérer les demandes asynchrones. Cette méthode sera déclenchée lorsqu'il existe une méthode de demande asynchrone dans le contrôleur @Override public void afrewCurrentHandlingStarted (HttpServletRequest Request, HttpservletResponse Response, Object Handler) lève une exception {}}Mettre en œuvre un intercepteur pour vérifier les autorisations simples
1. Personnaliser une annotation d'autorisation @auth
@ Hérité @ cible ({elementType.type, elementType.Method}) @ rétention(retentionPolicy.runtime)@documentdedPublic @Interface Auth {String User () Default "";}2. Ajouter des annotations à la méthode du contrôleur
Après avoir ajouté les annotations à l'étape précédente, vous devez ajouter des annotations pertinentes à la méthode que vous utilisez, comme suit.
@ RestController @ perteAutoConfigurationPublic class DemoController {@auth (user = "admin") @RequestMapping (value = "/ hello", méthode = requestMethod.get) public string sayshello () {return "bonjour world.";; }}3. Implémentez la fonction intercepteur
Exigences: Lorsque l'utilisateur accède à l'URI via le / Hello, il est vérifié. S'il est administrateur, il sera publié, sinon il sera rejeté. Supposons que l'identité de l'utilisateur se trouve dans le paramètre URL.
Idée: Par conséquent, nous devons vérifier l'utilisateur avant d'exécuter Sayshello (). Si son identité est la même que l'identité de l'annotation, elle sera publiée. Par conséquent, nous devons faire des histoires en pré-halte ().
Difficulté: comment obtenir l'annotation @Auth sur la méthode du contrôleur? En regardant les trois paramètres de prehandle (), il semble que personne ne puisse fournir des annotations dans la classe du contrôleur.
En fait, le troisième gestionnaire de paramètres, en général, son type est: org.springframework.web.method.handlerMethod, et il contient des informations pertinentes sur l'annotation.
Pourquoi le dites-vous?
Dans Springboot, le type d'annotation par défaut est le niveau de fonction, tandis que dans Springmvc, son type par défaut est le niveau d'objet contrôleur.
Par conséquent, si vous avez besoin de le configurer dans Dispatcher-Servlet.xml dans Springmvc:
<Bean />, de sorte que son type est handlerméthode.
Examinons la logique d'implémentation spécifique:
@Override public boolean prehandle (requête httpservletRequest, réponse httpservletResponse, gestionnaire d'objets) lève une exception {System.out.println ("prehandle"); if (! handler.getClass (). IsAssignableFrom (handlerMethod.class)) {System.out.println ("Handler Cat Cast à handlerMethod.class"); Retour Vrai; } // Get Annotation Auth Auth = ((handLerMethod) Handler) .getMethod (). GetAnnotation (auth.class); if (auth == null) {System.out.println ("ne peut pas trouver @Auth dans cet URI:" + request.getRequeSturi ()); Retour Vrai; } // supprimez l'identité de l'utilisateur à partir des paramètres et vérifiez la chaîne admin = auth.user (); if (! admin.equals (request.getParameter ("utilisateur"))) {System.out.println ("Autorisation refusée"); Response.SetStatus (403); retourne false; } return true; }En fait, il y a deux points dans la logique d'implémentation: éliminez l'identité des paramètres et comparez-le avec l'annotation.
4. Configurer l'intercepteur
Alors, comment l'intercepteur peut-il être efficace?
Pour le moment, nous devons configurer: webmvcconfigurerAdapter
La mise en œuvre spécifique est la suivante:
@ConfigurationPublic Class configAdapter étend webmvcconfigurerAdapter {@Override public void addInterceptors (InterceptorRegistry Registry) {registry.addinterceptor (new LoginInterceptor ()). AddPathPatterns ("/ hello"); }}Remarque: il y a deux points à noter ici. L'un est l'annotation @configuration, afin que le service Springboot puisse découvrir cette configuration; L'autre est la correspondance de configuration, qui est d'intercepter le "/ bonjour". ("/ **" est de bloquer tous les accès)
4. Opération
Visitez http://127.0.0.1:8080/hello?user=admin pour voir les résultats.
Pour plus de détails sur le code dans cet article, veuillez vous référer à: https://github.com/hawkingfoo/springboot-interceptor
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.