Springcloud Gateway – Gateway-Assertionsfabrik und Filterdetails sowie Konfiguration domänenübergreifender Probleme

Springcloud-Gateway Gateway-Assertionsfabrik und Filterdetails sowie Konfiguration domänenübergreifender Probleme

3.3 Routenprädikatfabrik

3.3.1 Elf grundlegende Prädikatsfabriken, die von Spring bereitgestellt werden (offizielle Dokumente können eingesehen werden, es ist nicht erforderlich, sie auswendig zu lernen)

Fügen Sie hier eine Bildbeschreibung ein

3.3.2 Nehmen Sie After als Beispiel, um die Assertionsfabrik zu demonstrieren

Konfigurieren Sie die Routing-Assertion von orderservice. Danach kann nur zum angegebenen Zeitpunkt zugegriffen werden

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

Wenn nach dem Festlegen der Assertionsfabrik die Assertionsregeln nicht erfüllt werden, meldet der Zugriff auf den Bestellservice über das Gateway 404
Fügen Sie hier eine Bildbeschreibung ein

Stellen Sie „Nachher“ auf „Vorher“ ein, um erfolgreich darauf zugreifen zu können

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

Fügen Sie hier eine Bildbeschreibung ein

3.4 Routenfilter GatewayFilter

3.4.1 Wenn Benutzer Gateway-Dienste anfordern, geben sie zuerst die Route ein und durchlaufen dann eine Reihe von Filterketten (wie in der Abbildung dargestellt).

Fügen Sie hier eine Bildbeschreibung ein

3.4.2 Nehmen Sie AddRequestHeader als Beispiel zur Demonstration

Fügen Sie allen Anforderungen, die in den Benutzerservice eingehen, einen Anforderungsheader hinzu: Springcloud 666

1. Ändern Sie die Datei „application.yml“ im Gateway und fügen Sie einen Filter zur Route „userservice“ hinzu

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

2. springmvc ruft den Anforderungsheader ab

@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. Der Anforderungsheader wurde erfolgreich abgerufen

Fügen Sie hier eine Bildbeschreibung ein

4. Konfigurieren Sie für alle Microservices denselben Filter. Sie können Standardfilter verwenden (beachten Sie, dass der vorherige Filter zu diesem Zeitpunkt mit Anmerkungen versehen wurde).

  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. Der Anforderungsheader kann weiterhin erfolgreich abgerufen werden, was darauf hinweist, dass auch der Standardfilter wirksam ist

Fügen Sie hier eine Bildbeschreibung ein

3.4.3 GlobalFilter

1. Die Funktion des globalen Filters besteht auch darin, alle im Gateway eingehenden Anforderungen und Microservice-Antworten zu verarbeiten. Er hat die gleiche Funktion wie der GatewayFilter, es gibt jedoch Unterschiede zwischen den beiden. Der Unterschied liegt darin

GatewayFilter wird durch Konfigurationsdateien definiert, die für die Verarbeitung einiger logisch festgelegter Antworten geeignet sind, während die Logik von GlobalFilter durch das Schreiben von Code selbst implementiert werden muss, was flexibler ist

2. Angepasste Methode: Durch Implementierung der GlobalFilter-Schnittstelle wird ein globaler Filter implementiert, um eine einfache Anmeldeauthentifizierung zu erreichen

@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. Wenn kein Anforderungsparameter vorhanden ist, wird der Statuscode 401 gemeldet, der angibt, dass Sie nicht angemeldet sind

Fügen Sie hier eine Bildbeschreibung ein

4. Wenn Anforderungsparameter vorhanden sind, werden die Daten erfolgreich abgerufen

Fügen Sie hier eine Bildbeschreibung ein

3.4.4 Ausführungsreihenfolge der Filter

3.4.4.1 Arten von Routenfiltern

Wenn eine Anfrage das Gateway betritt, trifft sie auf drei Arten von Filtern: Filter für aktuelle Route, DefaultFilter, GlobalFilter

Nach der Anforderung des Routings werden der aktuelle Routing-Filter, DefaultFilter und GlobalFilter zu einer Filterkette (dh einer Sammlung) zusammengeführt und jeder Filter wird nach dem Sortieren der Reihe nach ausgeführt

Fügen Sie hier eine Bildbeschreibung ein

3.4.4.2 Ausführungsreihenfolge

Jeder Filter muss einen Bestellwert vom Typ int angeben. Je kleiner der Bestellwert, desto höher die Priorität und desto höher die Ausführungsreihenfolge.

GlobalFilter gibt den Bestellwert an, indem es die Ordered-Schnittstelle implementiert oder die von uns angegebene @Order-Annotation hinzufügt

Die Reihenfolge der Routing-Filter und des DefaultFilters wird von Spring festgelegt, und der Standardwert besteht darin, entsprechend der Deklarationsreihenfolge von 1 zu steigen.

Wenn die Reihenfolgewerte der Filter gleich sind, werden sie in der Reihenfolge defaultFilter > Routingfilter > GlobalFilter ausgeführt.

3.5 Domänenübergreifende Problemlösung

3.5.1 Definition von domänenübergreifend

Inkonsistente Domänennamen sind domänenübergreifend und umfassen hauptsächlich:

Verschiedene Domainnamen: www.taobao.com und www.taobao.org und www.jd.com und miaosha.jd.com

Gleicher Domänenname, unterschiedliche Ports: localhost:8080 und localhost8081

Domänenübergreifendes Problem: Der Browser verhindert, dass der Absender der Anfrage eine domänenübergreifende Ajax-Anfrage an den Server stellt, und die Anfrage wird vom Browser abgefangen

(Beachten Sie, dass die Ajax-Anfrage des Browsers normalerweise an den Server gesendet wird, der Server jedoch nicht antwortet.)

Lösung: CORS-Konfiguration

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 # 这次跨域检测的有效期






















































Ich denke du magst

Origin blog.csdn.net/weixin_64133130/article/details/130296037
Empfohlen
Rangfolge