Maison  >  Article  >  Java  >  Comment utiliser l'intercepteur Interceptor dans SpringBoot

Comment utiliser l'intercepteur Interceptor dans SpringBoot

王林
王林avant
2023-05-11 09:13:051309parcourir

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 :

Comment utiliser lintercepteur Interceptor dans SpringBoot

Comment utiliser lintercepteur Interceptor dans SpringBoot

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 ;

Comment utiliser lintercepteur Interceptor dans SpringBoot

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 ;

Comment utiliser lintercepteur Interceptor dans SpringBoot

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 ;

Comment utiliser lintercepteur Interceptor dans SpringBoot

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer