长春建设集团网站,网站开发与维护工资,自己开网站能赚钱吗,可以做富集分析的网站在集成 Spring Cloud Gateway 网关的时候#xff0c;会出现没有 basePath 的情况#xff0c;例如定义的 /jeeplus-auth、/jeeplus-system 等微服务前缀导致访问接口404#xff1a;
maven依赖#xff1a;
swagger2于17年停止维护#xff0c;现在最新的版本为 Swagger3会出现没有 basePath 的情况例如定义的 /jeeplus-auth、/jeeplus-system 等微服务前缀导致访问接口404
maven依赖
swagger2于17年停止维护现在最新的版本为 Swagger3Open Api3
knife4j.version3.0.3/knife4j.version直接访问是找不到url的 如果手动添加前缀是可以的 但是每一个接口都要手动添加前缀太繁琐了也失去了用swagger接口的意义这时候我们需要在 Gateway 网关添加一个 Filter 过滤器
在网关模块添加一个过滤器SwaggerGlobalFilter 过滤器代码
package com.jeeplus.gateway.filter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;/*** swagger v3/api-docs缺失basePath 过滤器** Author 955* Date 2022-09-22 11:31* Description*/
Slf4j
Component
public class SwaggerGlobalFilter implements GlobalFilter, Ordered{public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request exchange.getRequest();String path request.getPath().toString();String host request.getLocalAddress().getHostString();int port request.getLocalAddress().getPort();if (!path.endsWith(/v3/api-docs)) {return chain.filter(exchange);}String[] pathArray path.split(/);System.out.println(pathArray);String basePath pathArray[1];ServerHttpResponse originalResponse exchange.getResponse();// 定义新的消息头ServerHttpResponseDecorator decoratedResponse new ServerHttpResponseDecorator(originalResponse) {Overridepublic MonoVoid writeWith(Publisher? extends DataBuffer body) {if (super.getStatusCode().equals(HttpStatus.OK) body instanceof Flux) {Flux? extends DataBuffer fluxBody Flux.from(body);return super.writeWith(fluxBody.buffer().map(dataBuffers - {ListString list new ArrayList();dataBuffers.forEach(dataBuffer - {byte[] content new byte[dataBuffer.readableByteCount()];dataBuffer.read(content);DataBufferUtils.release(dataBuffer);list.add(new String(content, Charset.forName(UTF-8)));});String s this.listToString(list);JSONObject jsonObject JSON.parseObject(s);jsonObject.put(host, host : port);jsonObject.put(basePath, basePath);s jsonObject.toString();// 设置更新后的header请求头长度int length s.getBytes().length;HttpHeaders headers originalResponse.getHeaders();headers.setContentLength(length);return bufferFactory().wrap(s.getBytes(Charset.forName(UTF-8)));}));}return super.writeWith(body);}Overridepublic HttpHeaders getHeaders() {// 获取父类原始ServerHttpResponse的header请求头信息这是代理Delegate类型HttpHeaders httpHeaders super.getHeaders();httpHeaders.set(HttpHeaders.CONTENT_TYPE, application/json;charsetUTF-8);return httpHeaders;}private String listToString(ListString list) {StringBuilder stringBuilder new StringBuilder();for (String s : list) {stringBuilder.append(s);}return stringBuilder.toString();}};// replace response with decoratorreturn chain.filter(exchange.mutate().response(decoratedResponse).build());}Overridepublic int getOrder() {return -2;}}
重启再次查看发现已经正常了。 测试一下接口