L'utilisation des intercepteurs dans Springboot est également relativement simple, implémentez l'interface HandlerInterceptor ou AsyncHandlerInterceptor, puis ajoutez l'intercepteur de la configuration ;
L'interface AsyncHandlerInterceptor hérite de HandlerInterceptor, avec une méthode afterConcurrentHandlingStarted supplémentaire :
Methods in l'interface :
preHandle : exécuté avant le Controller, vous pouvez déterminer les paramètres, exécuter les méthodes du contrôleur, etc., la valeur de retour est booléenne, renvoyer true et continuer à fonctionner (l'intercepteur et le contrôleur ci-dessous), sinon commencez à renvoyer l'opération ( exécuter le retour de l'intercepteur précédent et d'autres opérations);
postHandle : exécuté après le contrôleur et avant le retour de la vue, ModelAndView peut être traité avant le retour
afterCompletion : exécuté une fois la demande terminée
; afterConcurrentHandlingStarted : Cette méthode sera appelée et exécutée à l'aide d'un nouveau thread uniquement lorsque la valeur de retour du contrôleur est java.util.concurrent.Callable
Il existe deux ordres d'exécution des méthodes :
preHandle -> Contrôleur -> postHandle -> afterCompletion;
preHandle -> Execute Controller -> afterConcurrentHandlingStarted -> (la méthode du contrôleur renvoie un objet appelable)
Configuration des intercepteurs :
Implémentez la méthode addInterceptors dans l'interface WebMvcConfigurer, utilisez le paramètre de l'objet InterceptorRegistry pour ajouter votre propre intercepteur, vous pouvez ajouter des chemins d'interception spécifiés ou supprimer certains chemins de filtrage, et vous peut également définir la priorité de l'ordre des niveaux d'intercepteur, priorité de petit à grand, par défaut 0 ;
Ordre d'exécution de plusieurs intercepteurs :
La méthode preHandle est dans l'ordre de petit à grand. Après avoir exécuté le contrôleur, les autres méthodes sont inversées. ordre, suivi du filtre Le filtre est similaire ;
Classe de démarrage de test, configuration par défaut :
/** * 2023年3月16日下午4:56:23 */ package testspringboot.test9interceptor; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author XWF * */ @SpringBootApplication public class Test9Main { /** * @param args */ public static void main(String[] args) { SpringApplication.run(Test9Main.class, args); } }
Classe de contrôleur :
/** * 2023年3月16日下午4:58:02 */ package testspringboot.test9interceptor; import java.util.concurrent.Callable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author XWF * */ @RestController @RequestMapping("/interceptor") public class Test9Controller { @RequestMapping("/a") public String a(String s) { System.out.println(">>>a():" + s); return "OK"; } @RequestMapping("/b") public Callable<String> b() { Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(2000); System.out.println("call() thread id=" + Thread.currentThread().getId()); Thread.sleep(2000); return "abcdefg"; } }; System.out.println(">>>b()"); return callable; } }
Deux intercepteurs personnalisés 1 et 2 :
/** * 2023年3月16日下午5:14:14 */ package testspringboot.test9interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * @author XWF * */ public class MyInterceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle 1, handler=" + handler); return request.getQueryString().length() < 10 ? true : false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle 1"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion 1"); } }
/** * 2023年3月16日下午5:15:28 */ package testspringboot.test9interceptor; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.AsyncHandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * @author XWF * */ @Component public class MyInterceptor2 implements AsyncHandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle 2 " + new Date() + " ThreadId=" + Thread.currentThread().getId()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle 2"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion 2"); } @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("afterConcurrentHandlingStarted 2 " + new Date()); } }
Intercepteur de configuration :
/** * 2023年3月16日下午5:20:31 */ package testspringboot.test9interceptor; import javax.annotation.Resource; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @author XWF * */ @Configuration public class MyInterceptorConfig implements WebMvcConfigurer { @Resource MyInterceptor2 myinterceptor2; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor1()) .addPathPatterns("/interceptor/a") //添加拦截路径,两种参数List<String>和String ... .excludePathPatterns("/interceptor/b") //排除路径,两种参数List<String>和String ... .order(1); //设置拦截器顺序,由小到大,默认0 registry.addInterceptor(myinterceptor2); //也可以使用spring管理的对象 } }
Envoyer une demande de post-test : http:/ /192.168.1.30:8080/interceptor/a?s=hello, l'ordre de l'intercepteur 2 est par défaut 0 et l'ordre de l'intercepteur 1 est 1. PreHandle exécute 2 en premier Une fois le contrôleur exécuté, les handles restants. exécutez d'abord 1. Ensuite, exécutez 2 ;
Envoyez une requête avec preHandle renvoyant false : http://192.168.1.30:8080/interceptor/a?s=hello123456789. Après que le preHandle de l'intercepteur 1 ait renvoyé false, exécutez d'abord. afterCompletion of 2 ;
Envoyer une requête pour tester l'appelable : http://192.168.1.30:8080/interceptor/b?s=hello, la configuration du chemin d'interception ignore l'intercepteur 1 et exécute uniquement l'intercepteur 2. Vous pouvez voir l'avant et après utilisation via threadid Il y a deux fils de discussion ;
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!