自研网关:特殊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,对前端负担太重了.
- 43 Hot Flex and ActionScript 3.0 APIs, tips and tools for Autumn 2008
- 异步数据存储
- 谈谈基于SQL Server 的Exception Handling[中篇]
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
- 如何仅使用TensorFlow C+来训练深度神经网络
- 捕获silverlight滚轮事件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
- 用谷歌浏览器来当手机模拟器
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(27)-权限管理系统-分配用户给角色
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户
- 体验vs11 Beta
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
- 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 数组属性和方法
- 服务治理之重试篇
- 一次排查线上接口偶发异常耗时引起的思考!
- 台阶很高,青蛙跳不跳?
- 从零开始认识堆排序
- Redis SDS 深入一点,看到更多!
- Centos7下Oracle 11g r2 本地/远程 用exp/imp命令快速导入导出数据 实践笔记
- js常用函数大全107个
- xtraReprot 动态绑定数据 数据列动态
- 线上问题分析之java dump文件生成
- python基础知识
- AtCoder Beginner Contest 177 A ~ E
- 2017 年ICPC 中国大陆区域赛铜牌题解
- 搜索(DFS BFS)专题练习
- AtCoder Beginner Contest 171
- AtCoder Beginner Contest 173 A ~ F(已经补完)