## 全局过滤器
全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,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开启端口