spring cloud alibaba-Geteway詳解

spring cloud alibaba-Gateway詳解

Gateway介紹

在 Spring Cloud Alibaba 生態系統中,Gateway 是一個非常重要的組件,用于構建微服務架構中的網關服務。它基于 Spring Cloud Gateway 進行擴展和優化,提供了更強大的功能和更好的性能。

Gateway功能

  1. 統一入口
    ? 微服務架構中,多個服務通常部署在不同的地址和端口上。網關作為統一的入口,將所有服務的請求集中管理,客戶端只需要與網關交互,而不需要直接與各個微服務通信。
    ? 這樣可以簡化客戶端的邏輯,同時提高系統的安全性。
  2. 請求路由
    ? 根據請求的特征(如路徑、方法、參數等)將請求轉發到對應的后端服務。
    ? 路由規則可以動態配置,方便調整服務的訪問路徑。
  3. 負載均衡
    ? 當后端服務有多個實例時,網關可以根據一定的策略(如輪詢、隨機、權重等)將請求分發到不同的實例,提高系統的可用性和性能。
  4. 流量控制
    ? 限制請求的流量,防止后端服務被過多的請求壓垮。
    ? 常見的流量控制算法包括令牌桶算法、滑動窗口算法等。
  5. 身份認證
    ? 對請求進行身份驗證,確保只有合法的用戶才能訪問后端服務。
    ? 常見的身份驗證方式包括基于令牌(如 JWT)、基于用戶名和密碼等。
  6. 協議轉換
    ? 將一種協議的請求轉換為另一種協議的請求,例如將 HTTP 請求轉換為 gRPC 請求。
    ? 這樣可以實現不同協議之間的通信,提高系統的靈活性。
  7. 系統監控
    ? 監控網關的運行狀態,包括請求量、響應時間、錯誤率等指標。
    ? 通過監控可以及時發現系統的問題,提高系統的可靠性。
  8. 安全防護
    ? 防止惡意攻擊,如 SQL 注入、XSS 攻擊、CSRF 攻擊等。
    ? 通過安全策略(如防火墻規則、WAF 等)保護系統免受攻擊。

創建網關

創建一個新項目

  1. 導入依賴
        <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies>
  1. 編寫啟動類
package com.nie.gateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplicationMain {public static void main(String[] args) {SpringApplication.run(GatewayApplicationMain.class,args);}
}
  1. 配置application.yml文件
spring:application:name: gatewaycloud:nacos:server-addr: 127.0.0.1:8848profiles:include: route
server:port: 80
  1. 配置路由規則 application-route.yml
spring:cloud:gateway:routes:- id: order-routeuri: lb://service-orderpredicates:- Path=/api/order/**- id: product-routeuri: lb://service-productpredicates:- Path=/api/product/**
@RequestMapping("/api/order/")
@RestController
public class OrderController {@GetMapping("/readDb")public String readDb(){return "readDb";}}

測試:說明是能訪問到的
在這里插入圖片描述

  1. 進入Nacos
    在這里插入圖片描述

斷言

斷言工廠
名稱參數(個數/類型)作用
After1/datetime在指定時間之后
Before1/datetime在指定時間之前
Between2/datetime在指定時間區間內
Cookie2/string, regexp包含cookie名且必須匹配指定值
Header2/string, regexp包含請求頭且必須匹配指定值
HostN/string請求host必須是指定枚舉值
MethodN/string請求方式必須是指定枚舉值
Path2/List, bool請求路徑滿足規則,是否匹配最后的/
Query2/string, regexp包含指定請求參數
RemoteAddr1/List請求來源于指定網絡域(CIDR寫法)
Weight2/string, int按指定權重負載均衡
XForwarded1/List從X-Forwarded-For請求頭中解析請求來源,并判斷是否來源于指定網絡域

例如:
predicates的意思就是斷言
Cookie:路由斷言工廠(名)
mycookie,mycookievalue:參數

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- Cookie=mycookie,mycookievalue

假如我們要轉發到百度 我們在加上一些斷言規則

spring:cloud:gateway:routes:- id: bing-routeuri: https://cn.bing.com/predicates:- name: Pathargs:pattern: /search- name: Queryargs:param: qregexp: haha

這時候我們訪問時必須為/serrch 必須帶上參數 參數名為q 值必須為haha我們才能成功轉發
在這里插入圖片描述

如果值不等于haha 或者參數名不為q 那么會出現404找不到頁面錯誤
在這里插入圖片描述

自定義斷言工廠
package com.nie.gateway.predicate;import jakarta.validation.constraints.NotEmpty;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;/*** 自定義的VIP路由斷言工廠類,用于根據請求參數判斷是否匹配VIP路由。* 繼承自AbstractRoutePredicateFactory,實現了自定義路由斷言邏輯。*/
@Component
public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory<VipRoutePredicateFactory.Config> {/*** 構造函數,指定配置類為Config。*/public VipRoutePredicateFactory() {super(Config.class);}/*** 實現apply方法,根據Config中的配置生成路由斷言邏輯。** @param config 配置對象,包含請求參數名和期望值* @return 返回一個Predicate<ServerWebExchange>,用于判斷請求是否匹配VIP路由*/@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new GatewayPredicate() {/*** 判斷請求是否匹配VIP路由的邏輯。** @param serverWebExchange 當前的請求上下文* @return 如果請求參數中存在指定參數且值匹配,則返回true,否則返回false*/@Overridepublic boolean test(ServerWebExchange serverWebExchange) {ServerHttpRequest request = serverWebExchange.getRequest();// 獲取請求參數中指定參數的第一個值String first = request.getQueryParams().getFirst(config.param);// 判斷參數值是否存在且是否等于配置的期望值if (StringUtils.hasText(first) && first.equals(config.value)) {return true;}return false;}};}/*** 定義配置類的字段順序,用于在配置文件中指定參數時的順序。** @return 返回字段順序列表*/@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("param", "value");}/*** 配置類,用于存儲路由斷言的配置信息。*/@Validatedpublic static class Config {/*** 請求參數名,用于從請求中獲取參數值。*/@NotEmptyprivate String param;/*** 請求參數期望值,用于判斷請求參數值是否匹配。*/@NotEmptyprivate String value;/*** 獲取請求參數名。** @return 返回請求參數名*/public String getParam() {return param;}/*** 設置請求參數名。** @param param 請求參數名*/public void setParam(String param) {this.param = param;}/*** 獲取請求參數期望值。** @return 返回請求參數期望值*/public String getValue() {return value;}/*** 設置請求參數期望值。** @param value 請求參數期望值*/public void setValue(String value) {this.value = value;}}
}
spring:cloud:gateway:routes:- id: bing-routeuri: https://cn.bing.com/predicates:- name: Pathargs:pattern: /search- name: Queryargs:param: qregexp: haha- name: Vipargs:param: uservalue: xiaonie

在這里插入圖片描述

我出現的錯誤

我在這里犯了一個大錯誤

java.lang.IllegalArgumentException: Unable to find RoutePredicateFactory with name VipRoutePredicateFactory

我檢查了好幾遍代碼都沒問題 最后我發現我在這里把這個包放在了外面去了 所以他沒有掃描到這個包 希望打架也注意一下

過濾器

路徑重寫

如果加上了路徑重寫那么微服務前面就不需要加上/api/模塊名

spring:cloud:gateway:routes:- id: bing-routeuri: https://cn.bing.com/predicates:- name: Pathargs:pattern: /search- name: Queryargs:param: qregexp: haha- name: Vipargs:param: uservalue: xiaonie- id: order-routeuri: lb://service-orderpredicates:- Path=/api/order/**filters:- RewritePath=/api/order/(?<segment>.*), /$\{segment}order: 1- id: product-routeuri: lb://service-productpredicates:- Path=/api/product/**filters:- RewritePath=/api/product/(?<segment>.*), /$\{segment}order: 2
package com.nie.order.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.nie.order.bean.Order;
import com.nie.order.properties.OrderProperties;
import com.nie.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate OrderProperties orderProperties;@GetMapping("/readDb")public String readDb(){return "readDb";}@GetMapping("/seckill")@SentinelResource(value = "seckill-order", fallback = "seckillFallback")public Order seckill(@RequestParam("userId") Long userId,@RequestParam("productId") Long productId){Order order = orderService.createOrder(productId, userId);order.setId(Long.MAX_VALUE);return order;}public Order seckillFallback(Long userId, Long productId, Throwable exception){System.out.println("已經開始限制了");Order order = new Order();order.setId(productId);order.setUserId(userId);order.setAddress("異常信息:" + exception.getClass());return order;}@GetMapping("/config")public String config(){return "order.timeout = " + orderProperties.getTimeout()+ ", order.auto-confirm = " + orderProperties.getAutoConfirm()+"order.db="+orderProperties.getDb();}@GetMapping("/create")public Order createOrder(@RequestParam("userId") Long userId,@RequestParam("productId") Long productId){Order order = orderService.createOrder(productId,userId);return order;}
}

這樣也就能訪問 避免后期因為規劃不周到 需要大量改前綴
在這里插入圖片描述

          filters:- RewritePath=/api/product/(?<segment>.*), /$\{segment}- AddResponseHeader=X-Response-Abcd, 123

如果我們加上AddResponseHeader=X-Response-Abcd, 123
那么在我們每次請求中他都會帶上響應頭 值為123
在這里插入圖片描述

默認過濾器
      default-filters:- AddResponseHeader=X-Response-Abcd, 123

用上面的例子的話我們就在每次請求中都帶入了請求頭 值為123
就不用在每個微服務上面都加了

在這里插入圖片描述

全局Filters
package com.nie.gateway.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Slf4j
@Component
public class RtGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();String uri = request.getURI().toString();long start = System.currentTimeMillis();log.info("請求【{}】開始: 時間: {}", uri, start);//=============以上是前置邏輯================Mono<Void> filter = chain.filter(exchange).doFinally((result)->{//=============以下是后置邏輯================long end = System.currentTimeMillis();log.info("請求【{}】結束: 時間: {}, 耗時: {}ms",uri,end,end-start);}); //放行  10sreturn filter;}@Overridepublic int getOrder() {return 0;}
}

在這里插入圖片描述

自定義過濾器
          filters:- RewritePath=/api/order/(?<segment>.*), /$\{segment}- OnceTooken=X-Response-Token, uuid
package com.nie.gateway.filter;import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.UUID;@Component
public class OnceTokenGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {@Overridepublic GatewayFilter apply(NameValueConfig config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//每次響應之前,添加一個一次性令牌,支持 uuid, jwt等各種格式return chain.filter(exchange).then(Mono.fromRunnable(() -> {ServerHttpResponse response = exchange.getResponse();HttpHeaders headers = response.getHeaders();String value = config.getValue();if ("uuid".equalsIgnoreCase(value)) {value = UUID.randomUUID().toString();}if ("jwt".equalsIgnoreCase(value)) {value = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiIjoiMjQ4OTY3Nzg5IiwibmFtZSI6IkpvaG4gRG9lIiLCJleHAiOjE2NTM5MDk3OTksImlhdCI6MTY1MzkwOTc5OCwiZXhwIjoxNjUzOTA5NzkwLCJpc3MiOiJhdXRoIjoiLCJuYW1lIjoiYXV0aG9ycyIsImV4cCI6MTY1MzkwOTc5OCwianRpIjoiMjAyMyIsInR5cCI6IkpXVCJ9LCJpYXQiOjE2NTM5MDk3OTksImV4cCI6MTY1MzkwOTc5OCwiaXNzIjoiaHR0cHM6Ly9hdXRoLmF1dGhvcnMubmV0L3VzZXIiIsImF1dGhvcml0eSI6eyJpZGVudGl0eSI6eyJjbGllbnRzIjp7InVzZXJAZXhhbXBsZS5jb20iOnsiYWV0Ijp7InVzZXJAZXhhbXBsZS5jb20iOnsiZXhhbXBsZSI6eyJ1c2VyQGV4YW1wbGUiOnsiZXhhbXBsZSI6eyJ1c2VyQGV4YW1wbGUiOnsiZXhhbXBsZSI6eyJ1c2VyQGV4YW1wbGUiOnsiZXhhbXBsZSI6eyJ1c2VyQGV4YW1wbGUiOnsiZXhhbXBsZSI6eyJ1c2VyQGV4YW1wbGUiOnsiZXhhbXBsZSI6eyJ1c2VyGVyIjp7fSwicmV4cCI6eyJyIjoiLCJLCJsYW1vdW50aWVub3JhbCIsImZSI6eyJ1c2VyIjp7fX19LCJ30=\n";}headers.add(config.getName(), value);}));}};}}

在這里插入圖片描述

全局跨域

這樣配置application.yml之后
允許所有請求跨域 allowed-origin-patterns: ‘
允許全部請求來源 允許所有的頭 allowed-headers: '

允許所有的請求方式 allowed-methods: ‘*’

spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowed-origin-patterns: '*'allowed-headers: '*'allowed-methods: '*'

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81911.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS 直播技術及優化

iOS直播技術的實現和優化涉及多個技術環節&#xff0c;需結合協議選擇、編解碼方案、播放器技術及性能調優等多方面。 一、核心技術實現 協議選擇與傳輸優化 HLS&#xff08;HTTP Live Streaming&#xff09;&#xff1a;蘋果官方推薦&#xff0c;基于HTTP分片傳輸&#xff0c…

目標檢測135個前沿算法模型匯總(附源碼)!

目標檢測是計算機視覺核心方向之一&#xff0c;也是發論文的熱門領域&#xff01; 近來不僅YOLO算法迎來了新突破&#xff0c;迭代出YOLOv12&#xff01;Mamba、大模型等新技術的發展&#xff0c;也給該領域注入了全新的力量&#xff0c;取得了諸多顯著成果。比如性能飆升82.3…

期刊采編系統安裝升級錯誤

我們以ojs系統為例&#xff1a; PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /esci/data/html/classes/install/Upgrade.inc.php:1019 Stacktrace: #0 /esci/data/html/lib/pkp/classes/install/Installer.inc.php(415): Upgrade->con…

淺談無服務器WebSocket的優勢

實際上&#xff0c;一個實用的解決方案是將構建業務關鍵型實時平臺的復雜性卸載到專門的云服務中。 完全托管的無服務器 WebSocket 解決方案為事件驅動的消息傳遞提供了基礎結構;它使底層基礎設施成為一種商品。客戶端使用提供程序服務發送/接收低延遲消息&#xff0c;并專注于…

Python數據可視化高級實戰之二——熱力圖繪制探究

目錄 一、熱力圖的作用 二、熱力圖反映的信息類型 三、熱力圖的典型應用場景 1. 地球信息系統 (GIS) 2. 城市交通分析 3. 市場分析 4. 用戶行為分析 5. 網絡流量分析 6. 傳染病傳播分析 7. 社交媒體輿情分析 四、Python 繪制熱力圖的關鍵技術要點 1. 數據預處理 2. 顏色選擇與漸…

配電網運行狀態綜合評估方法研究

1評估指標體系的構建 [1]冷華,童瑩,李欣然,等.配電網運行狀態綜合評估方法研究[J].電力系統保護與控制,2017,45(01):53-59. 1.1評估范圍 圖1為配電系統組成示意圖&#xff0c;其中A、B、C分別表示高、中、低壓配電系統。高壓配變(也稱主變)將35kV或110kV的電壓降到10kV&#…

Docker安裝MinIO對象存儲中間件

MinIO 是一個高性能、分布式的對象存儲系統&#xff0c;兼容 Amazon S3 云存儲服務協議&#xff0c;廣泛應用于企業存儲、大數據、機器學習和容器化應用等領域。以下是詳細介紹&#xff1a; 核心特點 兼容 S3 API &#xff1a;全面兼容 Amazon S3 API&#xff0c;這意味著使用…

HTML回顧

html全稱:HyperText Markup Language(超文本標記語言) 注重標簽語義,而不是默認效果 規則 塊級元素包括: marquee、div等 行內元素包括: span、input等 規則1:塊級元素中能寫:行內元素、塊級元素(幾乎什么都能寫) 規則2:行級元素中能寫:行內元素,但不能寫:塊…

JAVA Spring MVC+Mybatis Spring MVC的工作流程*,多表連查

目錄 注解總結 將傳送到客戶端的數據轉成json數據 **描述一下Spring MVC的工作流程** 1。屬性賦值 BeanUtils.copyProperties(addUserDTO,user); 添加依賴&#xff1a; spring web、mybatis framework、mysql driver Controller和ResponseBody優化 直接改成RestControl…

H2數據庫中一條insert語句到生成java對象到數據寫入磁盤的完整步驟

H2 數據庫將 SQL 語句轉換為磁盤存儲的全過程可以分為以下 8 個關鍵步驟&#xff0c;我們以 INSERT INTO users (id, name) VALUES (1, Alice) 為例詳細說明&#xff1a; 1. SQL 解析與語法樹生成 詞法分析&#xff1a;拆分語句為 INSERT、INTO、users 等 Token語法分析&#…

重磅升級!Google Play商店改版上線

5 月 21 日消息&#xff0c;Android Headline 今天&#xff08;5 月 21 日&#xff09;發布博文&#xff0c;報道稱在 2025 年 I/O 開發者大會上&#xff0c;谷歌宣布更新 Google Play 應用商店&#xff0c;在優化用戶體驗的同時&#xff0c;提升開發者收益。 本次更新中&…

Docker面試題(1)

什么是Docker 一個容器化平臺 形式是容器 將你的應用程序及所有依賴項打包在一起 確保應用程序在任何環境中無縫運行 什么是Docker鏡像 Docker鏡像是Docker容器的源代碼 用于創建容器 使用build命令創建鏡像 什么是 Docker容器 包括應用程序及所有的依賴項 作為操作系統的獨立進…

Ulisses Braga-Neto《模式識別和機器學習基礎》

模式識別和機器學習基礎 [專著] Fundamentals of pattern recognition and machine learning / (美)烏利塞斯布拉加&#xff0d;內托(Ulisses Braga-Neto)著 ; 潘巍[等]譯 推薦這本書&#xff0c;作者有自己的見解&#xff0c;而且提供代碼。問題是難度高&#xff0c;對于初學…

RabbitMQ的簡介

三個概念 生產者&#xff1a;生產消息的服務消息代理&#xff1a;消息中間件&#xff0c;如RabbitMQ消費者&#xff1a;獲取使用消息的服務 消息隊列到達消費者的兩種形式 隊列&#xff08;queue&#xff09;:點對點消息通信&#xff08;point-to-point&#xff09; 消息進入隊…

自動切換剪貼板路徑中反斜杠為正斜杠

有時候需要將我們常見的win全路徑中反斜杠為正斜杠&#xff0c;每次用記事本&#xff0c;編輯替換非常麻煩&#xff0c;于是寫了這個工具&#xff0c;能自動修改剪貼板中的數據&#xff0c;只需要運行一下即可。 實現效果&#xff0c;將類似于下面的路徑&#xff1a; C:\User…

【時時三省】Python 語言----文件

目錄 1,文件打開 2, 文件關閉 3, 文件寫入 4, 文件讀出 5, 文件定位 6, 文件重命名 7, 復制文件 山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 1,文件打開 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…

React 個人筆記 Hooks編程

作用 配合函數式編程&#xff0c;保證在不產生類的時候完成一個整體的組件 常用組件 useStateuseContextuseReduceruseEffectuseMemouseCallback 前三個值為自變量 后三者為因變量 前三者相當于其他編程函數的變量聲明&#xff0c;而后三者相當于對變量進行了(if now ! pr…

logits是啥、傅里葉變換

什么是logtis&#xff1f; 在深度學習的上下文中&#xff0c;logits 就是一個向量&#xff0c;下一步通常被投給 softmax/sigmoid 的向量。。 softmax的輸出是分類任務的概率&#xff0c;其輸入是logits層。 logits層通常產生-infinity到 infinity的值&#xff0c;而softmax層…

Adobe Illustrator學習備忘

1.移動畫板&#xff1a;需按住空格鍵加鼠標一塊才能拖動 2.放大縮小畫板&#xff1a;按住Alt鍵加鼠標滾輪 3.撤回&#xff1a;CtrlZ 4.鋼筆練習網站&#xff1a;The Bzier Game

【初識】內網滲透——基礎概念,基本工具使用

目錄 一、域&#xff0c;工作組&#xff0c;域控制器&#xff0c;活動目錄相關概念&#xff1a; 域環境&#xff1a; 工作組&#xff1a; 域控制器DC&#xff1a; 活動目錄AD&#xff1a; 二、內網的基本場景&#xff1a; 三、內網滲透基本測試方案&#xff1a; #案例1一基本信…