## 全局過濾器
全局過濾器作用于所有的路由,不需要單獨配置,我們可以用它來實現很多統一化處理的業務需求,比如權限認證,IP訪問限制等等。目前網關統一鑒權`AuthFilter.java`就是采用的全局過濾器。
單獨定義只需要實現`GlobalFilter`, `Ordered`這兩個接口就可以了。
```
@Configuration
@Slf4j
public class AuthFilter implements GlobalFilter, Ordered {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 實現權限攔截方法
*/
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange, GatewayFilterChain gatewayFilterChain) {
ServerHttpRequest request = serverWebExchange.getRequest();
String url = request.getPath().pathWithinApplication().value();
log.debug("【網關權限攔截】.....url...."+url);
String token = serverWebExchange.getRequest().getHeaders().getFirst(SecConstant.REQUEST_AUTH_HEADER);
String versionNO = serverWebExchange.getRequest().getHeaders().getFirst(SecConstant.REQUEST_VERSION_HEADER);
serverWebExchange.getRequest().mutate().header(SecConstant.HEADER_KEY_FEIGN_FROM, SecConstant.HEADER_VALUE_FEIGN_FROM).build();
//swagger文檔請求 放過
if (url.endsWith("v2/api-docs")){
return gatewayFilterChain.filter(serverWebExchange);
}
//未攜帶token或token在黑名單內
if (StringUtils.isBlank(token) ||isBlackToken(token)) {
//跳過不需要驗證的路徑
//遠程配置文件獲取
String skipUrls = XxlConfClient.get("hjmall-gateway.skipauthurls", "");
String us[]=skipUrls.split(",");
//本地配置文件獲取
//if(Arrays.asList(skipAuthUrls).contains(url)){
if(Arrays.asList(us).contains(url)){
return gatewayFilterChain.filter(serverWebExchange);
}else{
ServerHttpResponse response = serverWebExchange.getResponse();
DataBuffer buffer=respMsg(response,"非法請求");
log.error("【網關權限攔截】.....非法請求url...."+url);
return response.writeWith(Flux.just(buffer));
}
}
log.info("token................."+token);
//驗證token數據合法性
Map tokenM= JwtUtil.verifyToken(token);
if(tokenM==null||tokenM.isEmpty()||tokenM.get("code").equals(CodeUtil.error)||tokenM.get("code").equals(CodeUtil.token_invalid)){
log.error("【網關權限攔截】.....token驗證失敗 url...."+url);
DataBuffer buffer=respMsg(serverWebExchange.getResponse(),"無效的Token");
return serverWebExchange.getResponse().writeWith(Flux.just(buffer));
}
String account= MapUtils.getString(tokenM, SecConstant.ACCOUNT);
if (StringUtils.isBlank(account)) {
ServerHttpResponse response = serverWebExchange.getResponse();
DataBuffer buffer=respMsg(response,"非法請求");
log.error("【網關權限攔截】.....非法請求url...."+url);
return response.writeWith(Flux.just(buffer));
}
initHeaders(request.getHeaders());
if (request.getMethod() == HttpMethod.OPTIONS) {
serverWebExchange.getResponse().setStatusCode(HttpStatus.OK);
return Mono.empty();
}
//將現在的request,添加當前身份
ServerHttpRequest mutableReq = serverWebExchange.getRequest().mutate().header(SecConstant.REQUEST_AUTH_HEADER_ACCOUNTID, account).build();
ServerWebExchange mutableExchange = serverWebExchange.mutate().request(mutableReq).build();
return gatewayFilterChain.filter(mutableExchange);
}
/**
* 判斷token是否在黑名單內
*/
private boolean isBlackToken(String token){
assert token != null;
String blackListKey= XxlConfClient.get("hjmall-gateway.token.black.key", "");
return redisTemplate.hasKey(String.format(blackListKey, token));
}
/**
* 設置過濾器的執行順序
*/
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
```
- 項目介紹
- 項目聲明
- 項目簡介
- 架構設計
- 項目亮點功能介紹
- 技術棧介紹
- 核心功能
- 運行環境
- 項目更新日志
- 文檔更新日志
- F&Q
- 部署教程
- 環境準備
- JDK安裝
- JDK1.8,17共存
- maven
- 分布式緩存Redis
- 單機版
- 集群
- 注冊&配置中心alibaba/nacos
- 介紹
- Nacos安裝
- Nacos配置中心
- Nacos注冊發現
- Nacos生產部署方案
- 服務監控-BootAdmin
- 基本介紹
- 如何使用
- 整合Admin-Ui
- 客戶端配置
- 鏈路追蹤
- 基本介紹
- SkyWalking-1
- Skywalking-1
- 消息隊列
- Kafka
- docker安裝kafka
- Linux集群
- Maven私服
- nexus安裝部署
- nexus使用介紹
- 全文搜索elasticsearch
- windows集群搭建
- docker安裝es
- ElasticHD
- linux集群部署
- 統一日志解決方案
- 日志解決方案設計
- 介紹與相關資料
- ELK安裝部署
- elasticsearch 7.5
- logstash-7.5
- kibana-7.5
- filebeat
- 服務監控-Prometheus
- Prometheus安裝配置
- Prometheus介紹
- grafana
- 持續集成部署CICD
- 自動化部署Jenkins
- 安裝部署win
- 打包發布遠程執行
- 安裝部署linux
- jenkins+gitlab+docker容器化工程自動化部署
- Git
- CICD說明
- 阿里云效
- CentOS_MYSQL安裝
- docker
- 安裝
- Docker安裝Nginx
- Docker部署啟動springboot
- dockerCompose
- harbor
- Docker私有鏡像倉庫
- Portainer
- Docker遠程連接設置
- 打包工程
- 必要啟動模塊
- 核心模塊
- 登錄認證
- 緩存功能
- 日志模塊
- 分布式鎖
- 消息隊列
- 異常處理
- 系統接口
- 參數驗證
- es檢索
- 數據導出
- 系統設計
- 系統總體架構
- 擴展模塊(可選)
- 限流熔斷alibaba/sentinel
- 使用Sentinel實現gateway網關及服務接口限流
- Sentinel使用Nacos存儲規則及同步
- 服務調用Feign
- Feign基本介紹
- 如何使用
- 負載均衡
- 請求超時
- 請求攔截器
- 分布式任務調度
- XXL-JOB
- 分布式事務
- TX-LCN
- Seata
- Seata原理解析
- 數據庫分庫分表
- swagger文檔
- 分布式ID生成器解決方案
- 服務網關CloudGateway
- 基本介紹
- 使用網關
- 路由配置
- 全局過濾器
- 服務認證授權架構設計
- 認證服務流程
- 授權服務流程
- 系統冪等性設計與實踐
- 分布式日志鏈路跟蹤
- 實時搜索系統設計
- 應用性能
- 壓力測試工具
- Apache JMeter介紹和安裝
- ApacheJMeter使用
- JVM
- JVM性能調優
- 常見JVM內存錯誤及解決方案
- JVM 分析工具詳解
- Spring Cloud性能調優
- Linux運維
- Linux 常用命令
- Linux開啟端口