dengsixing 3 vuotta sitten
vanhempi
commit
ae2b04bf11

+ 36 - 0
src/main/java/com/fdkankan/gateway/config/LogPathHostNameProperty.java

@@ -0,0 +1,36 @@
+package com.fdkankan.gateway.config;
+
+import ch.qos.logback.core.PropertyDefinerBase;
+import com.fdkankan.common.util.FileUtils;
+import org.springframework.util.ObjectUtils;
+
+//@Component
+public class LogPathHostNameProperty extends PropertyDefinerBase {
+
+//    @Value("${hostName.filePath:/opt/hosts/hosts.txt}")
+//    private String hostNamePath;
+
+    @Override
+    public String getPropertyValue() {
+
+        String hostNamePath = getContext().getProperty("hostName.filePath");
+        if(ObjectUtils.isEmpty(hostNamePath)){
+            hostNamePath = "/opt/hosts/hosts.txt";
+        }
+        String hostName = "null";
+        try {
+            hostName = FileUtils.readFile(hostNamePath);
+            // 去除空格
+            if(!ObjectUtils.isEmpty(hostName)){
+                hostName = hostName.trim().replaceAll("\\s","");
+            }
+        } catch (Exception e) {
+            System.err.println("=========================error======================");
+            System.err.println("从文件中获取服务器名称失败,文件路径:"+hostNamePath);
+            return hostName;
+        }
+        return hostName;
+    }
+
+
+}

+ 68 - 0
src/main/java/com/fdkankan/gateway/decorator/ResponseDecorator.java

@@ -0,0 +1,68 @@
+package com.fdkankan.gateway.decorator;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.response.ResultData;
+import java.nio.charset.Charset;
+import org.reactivestreams.Publisher;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferFactory;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.core.io.buffer.DefaultDataBufferFactory;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/7
+ **/
+public class ResponseDecorator extends ServerHttpResponseDecorator {
+    public ResponseDecorator(ServerHttpResponse delegate){
+        super(delegate);
+    }
+
+    @Override
+    @SuppressWarnings(value = "unchecked")
+    public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
+
+        if(body instanceof Flux) {
+            Flux<DataBuffer> fluxBody = (Flux<DataBuffer>) body;
+
+            return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
+                DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
+                DataBuffer join = dataBufferFactory.join(dataBuffers);
+
+                byte[] content = new byte[join.readableByteCount()];
+                join.read(content);
+                DataBufferUtils.release(join);// 释放掉内存
+
+                String bodyStr = new String(content, Charset.forName("UTF-8"));
+
+                //修改响应体
+                bodyStr = modifyBody(bodyStr);
+
+                getDelegate().getHeaders().setContentLength(bodyStr.getBytes().length);
+                return bufferFactory().wrap(bodyStr.getBytes());
+            }));
+        }
+        return super.writeWith(body);
+    }
+
+    //重写这个函数即可
+    private String modifyBody(String jsonStr){
+        ResultData resultData = JSON.parseObject(jsonStr, ResultData.class);
+        int code = resultData.getCode();
+        if(code < 0){
+            resultData.setMessage(ServerCode.SYSTEM_ERROR.message());
+        }
+        //TODO...修改响应体
+        return JSON.toJSONString(resultData);
+    }
+}

+ 13 - 5
src/main/java/com/fdkankan/gateway/filter/AccessLogFilter.java

@@ -1,6 +1,9 @@
 package com.fdkankan.gateway.filter;
 
+import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.common.response.ResultData;
 import com.fdkankan.gateway.log.GatewayLog;
 import com.fdkankan.gateway.util.WebUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -68,7 +71,6 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
 
         Route route = getGatewayRoute(exchange);
 
-
         String ipAddress = WebUtil.getIpAddress(request);
 
         GatewayLog gatewayLog = new GatewayLog();
@@ -81,7 +83,8 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
 
         MediaType mediaType = request.getHeaders().getContentType();
 
-        if(MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType) || MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)){
+        if(MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)
+            || MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)){
             return writeBodyLog(exchange, chain, gatewayLog);
         }else{
             return writeBasicLog(exchange, chain, gatewayLog);
@@ -120,7 +123,7 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
 
         Mono<String> modifiedBody = serverRequest.bodyToMono(String.class)
                 .flatMap(body ->{
-                    gatewayLog.setRequestBody(body);
+                    gatewayLog.setRequestBody(URLDecoder.decode(body, StandardCharsets.UTF_8));
                     return Mono.just(body);
                 });
 
@@ -136,6 +139,7 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
 
         return bodyInserter.insert(outputMessage,new BodyInserterContext())
                 .then(Mono.defer(() -> {
+
                     // 重新封装请求
                     ServerHttpRequest decoratedRequest = requestDecorate(exchange, headers, outputMessage);
 
@@ -224,7 +228,8 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
 
                     if (this.getStatusCode().equals(HttpStatus.OK)
                             && StrUtil.isNotBlank(originalResponseContentType)
-                            && originalResponseContentType.contains("application/json")) {
+//                            && originalResponseContentType.contains("application/json")
+                    ) {
 
                         Flux<? extends DataBuffer> fluxBody = Flux.from(body);
                         return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
@@ -239,7 +244,10 @@ public class AccessLogFilter  implements GlobalFilter, Ordered {
                             DataBufferUtils.release(join);
                             String responseResult = new String(content, StandardCharsets.UTF_8);
 
-                            gatewayLog.setResponseData(responseResult);
+                            ResultData resultData = JSON.parseObject(responseResult, ResultData.class);
+                            gatewayLog.setCode(resultData.getCode());
+                            gatewayLog.setMessage(resultData.getMessage());
+                            gatewayLog.setResponseData(JSON.toJSONString(resultData.getData()));
 
 
                             return bufferFactory.wrap(content);

+ 32 - 0
src/main/java/com/fdkankan/gateway/filter/RequestGlobalFilter.java

@@ -0,0 +1,32 @@
+package com.fdkankan.gateway.filter;
+
+import com.fdkankan.gateway.decorator.ResponseDecorator;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+/**
+ * <p>
+ * 此过滤器用于修改响应体
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/7
+ **/
+@Component
+public class RequestGlobalFilter implements GlobalFilter, Ordered {
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ResponseDecorator decorator = new ResponseDecorator(exchange.getResponse());
+        return chain.filter(exchange.mutate().response(decorator).build());
+    }
+
+    @Override
+    public int getOrder() {
+        return -99;
+    }
+}

+ 6 - 0
src/main/java/com/fdkankan/gateway/log/GatewayLog.java

@@ -28,6 +28,12 @@ public class GatewayLog {
     /**请求体*/
     @Field("requestBody")
     private String requestBody;
+    /**响应码*/
+    @Field("code")
+    private int code;
+    /**相应提示*/
+    @Field("message")
+    private String message;
     /**响应体*/
     @Field("responseData")
     private String responseData;

+ 2 - 2
src/main/resources/bootstrap-pro.yml

@@ -6,7 +6,7 @@ spring:
       config:
         server-addr: 192.168.0.47:8848
         file-extension: yaml
-        namespace: 4dkankan-dev
+        namespace: 4dkankan-pro
         extension-configs:
           - data-id: 4dkankan-gateway.yaml
             group: DEFAULT_GROUP
@@ -21,7 +21,7 @@ spring:
             refresh: true
       discovery:
         server-addr: 192.168.0.47:8848
-        namespace: public
+        namespace: 4dkankan-pro
 
 management:
   endpoints:

+ 1 - 1
src/main/resources/bootstrap-test.yml

@@ -6,7 +6,7 @@ spring:
       config:
         server-addr: 192.168.0.47:8848
         file-extension: yaml
-        namespace: 4dkankan-dev
+        namespace: 4dkankan-test
         extension-configs:
           - data-id: 4dkankan-gateway.yaml
             group: DEFAULT_GROUP

+ 3 - 1
src/main/resources/logback-spring.xml

@@ -4,10 +4,12 @@
 <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
 <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
 <configuration scan="true" scanPeriod="10 seconds">
+	<springProperty scope="context" name="LOG_PATH" source="logging.path"/>
+	<define name="hostName" class = "com.fdkankan.gateway.config.LogPathHostNameProperty"/>
 
 	<contextName>logback</contextName>
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="/data/4dkankan/logs/4dkankan_gateway" />
+	<property name="log.path" value="${LOG_PATH}/gateway" />
 
 	<!-- 彩色日志 -->
 	<!-- 彩色日志依赖的渲染类 -->