自研網(wǎng)關(guān)系統(tǒng)已開(kāi)源,求star
項(xiàng)目地址:
- 網(wǎng)關(guān)地址:https://gitee.com/starmark947618/starmark-gateway
現(xiàn)在網(wǎng)關(guān)已經(jīng)具備轉(zhuǎn)發(fā)的功能陨晶,但有些場(chǎng)景還是不滿(mǎn)足
- 如果業(yè)務(wù)系統(tǒng)臨時(shí)上了某個(gè)功能射众,出問(wèn)題造烁,需要不重啟限制使用崇猫,如何處理樊零。
- 如果業(yè)務(wù)系統(tǒng)正在升級(jí)刨肃,不想讓用戶(hù)繼續(xù)訪(fǎng)問(wèn)刃鳄,并提示友好盅弛,如何處理
-
如果業(yè)務(wù)系統(tǒng)想將某個(gè)頁(yè)面或某個(gè)功能轉(zhuǎn)發(fā)到某個(gè)地址,如何處理叔锐。
為了滿(mǎn)足上述場(chǎng)景挪鹏,開(kāi)發(fā)了一個(gè)特殊URL的功能,主要針對(duì)相關(guān)URL做臨時(shí)的處理.
特殊URL處理
特殊URL編輯
接口測(cè)試
主要代碼實(shí)現(xiàn)如下:
@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;
}
}
主要是通過(guò)過(guò)濾器對(duì)特殊的URL進(jìn)行攔截,根據(jù)不同的情況來(lái)做判斷愉烙,做跳轉(zhuǎn)或異常拋出
具體代碼大家可以去我的開(kāi)源項(xiàng)目中看讨盒,歡迎提ISSUE及需求。
因?yàn)橹挥幸粋€(gè)人步责,也歡迎大家參與進(jìn)來(lái).
- 網(wǎng)關(guān)地址:https://gitee.com/starmark947618/starmark-gateway
下期計(jì)劃:
1返顺。權(quán)限模塊兼容多模塊禀苦,可以不使用網(wǎng)關(guān)系統(tǒng),按傳統(tǒng)的方式做權(quán)限攔截
2遂鹊。業(yè)務(wù)系統(tǒng)的工程projectCode傳參的調(diào)整振乏,當(dāng)前每次請(qǐng)求都傳projectCode,對(duì)前端負(fù)擔(dān)太重了.