自研网关:特殊URL功能的开发
时间:2022-07-26
本文章向大家介绍自研网关:特殊URL功能的开发,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
自研网关系统已开源,求star 项目地址:
现在网关已经具备转发的功能,但有些场景还是不满足
- 如果业务系统临时上了某个功能,出问题,需要不重启限制使用,如何处理。
- 如果业务系统正在升级,不想让用户继续访问,并提示友好,如何处理
- 如果业务系统想将某个页面或某个功能转发到某个地址,如何处理。 为了满足上述场景,开发了一个特殊URL的功能,主要针对相关URL做临时的处理.
特殊URL处理
特殊URL编辑
接口测试 主要代码实现如下:
@Slf4j
public class GatewaySpecUrlWebFilter implements WebFilter {
@Autowired
private IProjectSpecUrlService projectSpecUrlService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
String projectCode = RequestHelper.getRequestProjectCode(exchange.getRequest());
Assert.hasText(projectCode, "工程编码不存在");
//特殊URL处理;
if (this.handleSpecUrls(exchange, projectCode)) {
return chain.filter(exchange.mutate().request(exchange.getRequest().mutate().path("/redirect").build()).build());
}
return chain.filter(exchange);
}
@SneakyThrows
private boolean handleSpecUrls(ServerWebExchange exchange, String projectCode) {
List<ProjectSpecUrlDto> specUrlDtos = projectSpecUrlService.findSpecUrlListByProjectCode(projectCode);
for (ProjectSpecUrlDto projectSpecUrlDto : specUrlDtos) {
if (this.handleSpecUrl(projectSpecUrlDto, exchange, projectCode)) {
return true;
}
}
return false;
}
@SneakyThrows
private boolean handleSpecUrl(ProjectSpecUrlDto projectSpecUrlDto, ServerWebExchange exchange, String projectCode) {
boolean isMatch = RequestHelper.isMatchUrl(projectSpecUrlDto.getAccessUrl(), exchange.getRequest().getURI().getPath(), projectCode);
if (isMatch) {
//URL匹配
if (projectSpecUrlDto.getOperation() == 0) {
// chain.filter(exchange.mutate().response(ServerResponse.temporaryRedirect(URI.create(projectSpecUrlDto.getRedirectUrl())).build()).request(exchange.getRequest()).build());
// chain.filter(exchange.mutate().request(exchange.getRequest().mutate().uri(new URI(projectSpecUrlDto.getRedirectUrl())).build()).build());
exchange.getAttributes().put("gateway_spec_url_redirect_url",projectSpecUrlDto.getRedirectUrl());
return true;
} else if (projectSpecUrlDto.getOperation() == 1) {
throw new CustomException(projectSpecUrlDto.getErrorMsg());
} else if (projectSpecUrlDto.getOperation() == 2) {
throw new BaseException(SystemErrorType.SPEC_URL_ERROR_ACCESS);
}
}
return false;
}
}
主要是通过过滤器对特殊的URL进行拦截,根据不同的情况来做判断,做跳转或异常抛出 具体代码大家可以去我的开源项目中看,欢迎提ISSUE及需求。 因为只有一个人,也欢迎大家参与进来.
- 网关地址:https://gitee.com/starmark947618/starmark-gateway 下期计划: 1。权限模块兼容多模块,可以不使用网关系统,按传统的方式做权限拦截 2。业务系统的工程projectCode传参的调整,当前每次请求都传projectCode,对前端负担太重了.
- 通过shell解析dump生成parfile(r2笔记76天)
- Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")
- 如何用R语言从网上读取多样格式数据
- C/C++——生成随机数
- PHP基础——PHP数组
- 使用shell抽取html数据之二(r2笔记75天)
- Python爬取链家网数据:新房楼盘价格分析
- 【编程基础】Java里面如何对字符串排序?
- 计算广告——广告定向实践
- 通过shell抓取html数据(r2笔记74天)
- 通过shell脚本分析足彩(r2笔记74天)
- 通过shell脚本得到数据字典的信息 (r2笔记72天)
- 机器学习算法实践——K-Means算法与图像分割
- 利用 Python、SciKit 和文本分类来构建客户行为描述模型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- docker垃圾回收机制
- 让运维更简单的7种定时任务实现方式
- Notes | Chrome 浏览器常用快捷键
- Python | 从 PDF 中提取文本内容
- Stata | 自动生成中南财大2019拟录取硕士研究生分析报告
- Stata | 聊聊数据排序的几种方式
- 在生产中应用广泛的排序算法
- SQL | SQL 必知必会笔记 (一 )
- 如何在树莓派4B上安装EMQ X Broker
- SQL | SQL 必知必会笔记 (二)
- 基于桶子法实现的两种排序算法
- Notes | 微观经济学课堂笔记(一)
- 将终结点图添加到你的ASP.NET Core应用程序中
- Stata | 爬取 CFPS 文献传送门并制作成 Markdown
- 委托的好处