SpringCloud系列之自定義GatewayFilterFactory
學習目的:
- 知道創建一個網關sample
- 知道網關的基本配置
- 知道自定義GatewayFilterFactory類
環境準備:
- JDK 1.8
- SpringBoot2.2.3
- SpringCloud(Hoxton.SR7)
- Maven 3.2+
- 開發工具
- IntelliJ IDEA
- smartGit
新增SpringBoot Initializer專案:New Module->Spring Initializer,選擇jdk版本,至少jdk8

packaging選擇jar,java version選擇jdk8的,然后點next

選擇Gateway的依賴,選擇之后會自動加上對應pom配置

新建專案之后,檢查pom是否有spring-cloud-starter-gateway
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
如果不通過idea的Spring Initializer新建專案的,需要自己加上:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
網關配置,業務場景,一個第三方的介面,經過網關路由之后需要在request header里加上一些校驗引數
spring:
application:
name: api-gateway # 指定application name
cloud:
gateway:
routes:
- id: get_user_info
uri: http://127.0.0.1:8083
predicates:
- Path=/api/findUser
filters:
- AddRequestHeader=passToken,a68f3eac-5b9c-4fc1-a900-98ee18574576
# FilterFactory名為自定義類名前幾個
- name: Custom
args:
passid: 7a11600c-403c-4260-9165-659e138ada9c
serviceId: d8c6ce4c-1b2c-4826-9044-4197d17aad87
自定義一個GatewayFilterFactory,命名后面統一加上GatewayFilterFactory,自定義的欄位配在yml的filters.name
package com.example.springcloud.gateway.filter.factories;
import com.example.springcloud.gateway.util.EncryptUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import java.util.Date;
/**
* <pre>
* 自定義網關過濾器
* </pre>
*
* <pre>
* @author mazq
* 修改記錄
* 修改后版本: 修改人: 修改日期: 2021/12/14 09:59 修改內容:
* </pre>
*/
@Slf4j
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config>
implements Ordered {
public CustomGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
String passToken = exchange.getRequest().getHeaders().getFirst("passToken");
log.info("passToken:{}" , passToken);
long now = new Date().getTime();
String timestamp = Long.toString((long)Math.floor(now/1000));
String signature = "";
try {
signature = EncryptUtils.toSHA256(timestamp + passToken + timestamp);
} catch (Exception e) {
e.printStackTrace();
}
log.info("signature:{}" , signature);
ServerHttpRequest request = exchange.getRequest().mutate()
.header("passid", config.getPassid())
.header("serviceId", config.getServiceId())
.header("signature", signature)
.build();
log.info("passid:{}" , config.getPassid());
log.info("serviceId:{}" , config.getServiceId());
return chain.filter(exchange.mutate().request(request).build());
});
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Data
public static class Config {
private String passid;
private String serviceId;
}
}
過濾器將在較早的階段執行其“pre”邏輯,但稍后會呼叫它的“post”實作:

官網的圖例:首先客戶端請求都會先經過Gateway Handler Mapping,匹配上就通過Gateway Web Handler轉給過濾器處理,過濾器分為PreFilter(前置過濾器)、PostFilter(后置過濾器),過濾器由虛線分隔的原因是,篩選器可以在發送代理請求之前和之后運行邏輯,所有“前置”過濾器邏輯均被執行,然后發出代理請求,發出代理請求后,將運行“后置”過濾器邏輯

import java.security.MessageDigest;
/**
* <pre>
* 加密工具類
* </pre>
*/
public class EncryptUtils {
/**
* sha256簽名演算法
*/
public static String toSHA256(String str) throws Exception {
MessageDigest messageDigest;
String encodeStr = "";
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
encodeStr = byte2Hex(messageDigest.digest());
} catch (Exception e) {
throw e;
}
return encodeStr;
}
/**
* byte轉換成16進制
*/
protected static String byte2Hex(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
String temp = null;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
}
控制臺列印:
signature:72bdd60d2fc6f115eabda1ced766c0c0aa7397521d653977b2fd15d6c6978587
passid:7a11600c-403c-4260-9165-659e138ada9c
serviceId:d8c6ce4c-1b2c-4826-9044-4197d17aad87
然后去第三方介面看請求header引數,可以帶過來
注意:如果網關配置不起效,可以嘗試設定ordered確定優先級,有多個配置,可以將配置位置適當挪前點
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382852.html
標籤:其他
上一篇:first-jmeter001
