Springcloud Gateway - Usine d'assertion de passerelle et détails de filtre et configuration des problèmes inter-domaines

Usine d'assertion Springcloud-Gateway Gateway et détails du filtre et configuration des problèmes inter-domaines

3.3 Fabrique de prédicats de routage

3.3.1 Onze usines de prédicats de base fournies par Spring (les documents officiels peuvent être consultés, pas besoin de les mémoriser par cœur)

insérez la description de l'image ici

3.3.2 Prenez After comme exemple pour démontrer la fabrique d'assertions

Configurez l'assertion de routage de orderservice, After n'est accessible qu'à l'heure spécifiée

- id: order-service #路由id 可自定义但要保证唯一性
  uri: lb://orderservice #路由的目标地址
  predicates: #判断请求是否符合路由规则的条件
    - Path=/order/**
    - After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Après avoir défini la fabrique d'assertions, si les règles d'assertion ne sont pas respectées, l'accès au service de commande via la passerelle signale 404
insérez la description de l'image ici

Définissez Après sur Avant pour accéder avec succès

Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

insérez la description de l'image ici

3.4 Filtre de routage GatewayFilter

3.4.1 Lorsque les utilisateurs demandent des services de passerelle, ils entrent d'abord dans la route, puis passent par une série de chaînes de filtrage (comme indiqué sur la figure)

insérez la description de l'image ici

3.4.2 Prenez AddRequestHeader comme exemple pour démontrer

Ajouter un en-tête de requête à toutes les requêtes entrant dans le service utilisateur : Springcloud 666

1. Modifiez le fichier application.yml dans la passerelle et ajoutez un filtre à la route userservice

- id: user-service #路由id 可自定义但要保证唯一性
  uri: lb://userservice #路由的目标地址
  predicates: #判断请求是否符合路由规则的条件
   - Path=/user/**
  filters:
    - AddRequestHeader=Truth,springcloud 666

2. springmvc obtient l'en-tête de la requête

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id ,
                      @RequestHeader (value = "Truth",required = false)String truth) {
    
    
    System.out.println(truth);
    return userService.queryById(id);
}

3. Obtention réussie de l'en-tête de la requête

insérez la description de l'image ici

4. Configurez le même filtre pour tous les microservices, vous pouvez utiliser des filtres par défaut (notez que le filtre précédent a été annoté à ce moment)

  routes: #网关的路由配置
        - id: user-service #路由id 可自定义但要保证唯一性
          uri: lb://userservice #路由的目标地址
          predicates: #判断请求是否符合路由规则的条件
           - Path=/user/**
#          filters:
#            - AddRequestHeader=Truth,springcloud 666
        - id: order-service #路由id 可自定义但要保证唯一性
          uri: lb://orderservice #路由的目标地址
          predicates: #判断请求是否符合路由规则的条件
            - Path=/order/**
            - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
      default-filters:
        - AddRequestHeader=Truth,springcloud 666!

5. L'en-tête de la demande peut toujours être obtenu avec succès, indiquant que le filtre par défaut est également en vigueur

insérez la description de l'image ici

3.4.3 Filtre global

1. La fonction du filtre global est également de traiter toutes les requêtes et réponses de microservice entrant dans la passerelle. Il a la même fonction que GatewayFilter, mais il existe des différences entre les deux. La différence réside dans

GatewayFilter est défini par des fichiers de configuration, ce qui convient au traitement de certaines réponses logiquement fixes, tandis que la logique de GlobalFilter doit être implémentée en écrivant vous-même du code, ce qui est plus flexible.

2. Manière personnalisée, en implémentant l'interface GlobalFilter pour réaliser un filtre global pour réaliser une authentification de connexion simple

@Component
@Order(-1)
public class AuthorizeFilter implements GlobalFilter {
    
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //获取参数中的authorization参数
        String authorization = queryParams.getFirst("authorization");
        //判断参数值是否等于admin
        if ("admin".equals(authorization)) {
    
    
            //是就放行
            return chain.filter(exchange);
        }
        //设置响应状态码401表示用户未登录
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //拦截
        return exchange.getResponse().setComplete();

    }
}

3. Lorsqu'il n'y a pas de paramètre de requête, un code d'état 401 est signalé, indiquant que vous n'êtes pas connecté

insérez la description de l'image ici

4. Lorsqu'il y a des paramètres de requête, les données sont obtenues avec succès

insérez la description de l'image ici

3.4.4 Ordre d'exécution des filtres

3.4.4.1 Types de filtres de routage

Lorsqu'une requête entre dans la passerelle, elle rencontre trois types de filtres : filtre de route actuel, DefaultFilter, GlobalFilter

Après avoir demandé le routage, le filtre de routage actuel, DefaultFilter et GlobalFilter seront fusionnés dans une chaîne de filtres (c'est-à-dire une collection), et chaque filtre sera exécuté à son tour après le tri.

insérez la description de l'image ici

3.4.4.2 Ordre d'exécution

Chaque filtre doit spécifier une valeur d'ordre de type int, plus la valeur d'ordre est petite, plus la priorité est élevée et plus l'ordre d'exécution est élevé.

GlobalFilter spécifie la valeur de la commande en implémentant l'interface Ordered ou en ajoutant l'annotation @Order, qui est spécifiée par nous-mêmes

L'ordre des filtres de routage et defaultFilter est spécifié par Spring, et la valeur par défaut est d'augmenter à partir de 1 selon l'ordre de déclaration.

Lorsque les valeurs d'ordre des filtres sont les mêmes, ils seront exécutés dans l'ordre defaultFilter > routing filter > GlobalFilter.

3.5 Résolution de problèmes inter-domaines

3.5.1 Définition de domaine croisé

Les noms de domaine incohérents sont inter-domaines, comprenant principalement :

Différents noms de domaine : www.taobao.com et www.taobao.org et www.jd.com et miaosha.jd.com

Même nom de domaine, ports différents : localhost:8080 et localhost8081

Problème inter-domaine : le navigateur interdit à l'auteur de la requête de faire une requête ajax inter-domaine avec le serveur, et la requête est interceptée par le navigateur

(Notez que la requête ajax du navigateur est normalement envoyée au serveur, mais le serveur ne répond pas)

Solution : configuration CORS

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期






















































Je suppose que tu aimes

Origine blog.csdn.net/weixin_64133130/article/details/130296037
conseillé
Classement