Die Verwendung von Interceptoren in Springboot ist ebenfalls relativ einfach. Implementieren Sie die HandlerInterceptor- oder AsyncHandlerInterceptor-Schnittstelle und fügen Sie dann den Interceptor aus der Konfiguration hinzu s in die Schnittstelle:
preHandle: Wird vor dem Controller ausgeführt. Sie können Parameter, ausgeführte Controller-Methoden usw. bestimmen. Der Rückgabewert ist boolesch, gibt true zurück und läuft weiter (der Interceptor und Controller unten). Ausführen der vorherigen Interceptor-Rückgabe und anderer Vorgänge); afterConcurrentHandlingStarted: Diese Methode wird nur dann aufgerufen und mit einem neuen Thread ausgeführt, wenn der Rückgabewert des Controllers java.util.concurrent.Callable ist. Es gibt zwei Methodenausführungsreihenfolge:
PreHandle -> Controller -> postHandle -> Execute Controller -> Call()-Methode -> (Controller-Methode gibt Callable Object zurück)
Implementieren Sie die addInterceptors-Methode in der WebMvcConfigurer-Schnittstelle, verwenden Sie den Parameter InterceptorRegistry-Objekt, um Ihren eigenen Interceptor hinzuzufügen, Sie können angegebene Abfangpfade hinzufügen oder bestimmte Filterpfade entfernen, und Sie Sie können auch die Priorität der Interceptor-Ebene festlegen, Priorität von klein nach groß, Standard 0; Reihenfolge, gefolgt vom Filter Filter ist ähnlich;
/** * 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); } }
Controller-Klasse:
/** * 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; } }
/** * 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()); } }
Konfigurations-Interceptor:
/** * 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管理的对象 } }
Senden Sie eine Anfrage zum Testen von Callable: http://192.168.1.30:8080/interceptor/b?s=hello, die Abfangpfadkonfiguration überspringt Interceptor 1 und führt nur Interceptor 2 aus. Sie können sehen die Vorher- und Nachher-Verwendung durch threadid Es gibt zwei Threads;
Das obige ist der detaillierte Inhalt vonSo verwenden Sie den Interceptor-Interceptor in SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!