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

So verwenden Sie den Interceptor-Interceptor in SpringBoot

王林
王林nach vorne
2023-05-11 09:13:051335Durchsuche

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);
        }
     
    }

    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;
        }
        
    }
  • 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");
        }
        
    }
    /**
     * 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 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen