Heim > Java > javaLernprogramm > So verwenden Sie den Interceptor-Interceptor in SpringBoot

So verwenden Sie den Interceptor-Interceptor in SpringBoot

王林
Freigeben: 2023-05-11 09:13:05
nach vorne
1359 Leute haben es durchsucht

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: So verwenden Sie den Interceptor-Interceptor in SpringBoot

So verwenden Sie den Interceptor-Interceptor in SpringBootPreHandle -> Controller -> postHandle -> Execute Controller -> Call()-Methode -> (Controller-Methode gibt Callable Object zurück)

    Interceptoren konfigurieren:
  • 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;

  • Test-Startup-Klasse, Standardkonfiguration:
  • /**
     * 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);
        }
     
    }
    Nach dem Login kopieren

    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;
        }
        
    }
    Nach dem Login kopieren
  • Zwei benutzerdefinierte Interceptoren 1 und 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");
        }
        
    }
    Nach dem Login kopieren
    /**
     * 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());
        }
        
    }
    Nach dem Login kopieren

    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管理的对象
        }
        
    }
    Nach dem Login kopieren
  • Senden Sie eine Post-Test-Anfrage: http://192.168.1.30:8080/interceptor/a?s=hello, die Reihenfolge von Interceptor 2 ist standardmäßig 0 und die Reihenfolge von Interceptor 1 ist 1. PreHandle führt zuerst 2 aus, nachdem der Controller ausgeführt wurde, die restlichen Handles Führen Sie zuerst 1 aus. Führen Sie dann 2 aus.
Senden Sie eine Anfrage mit dem Rückgabewert „false“: http://192.168.1.30:8080/interceptor/a?s=hello123456789. Führen Sie den Befehl direkt aus afterCompletion of 2;

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

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage