yumeng před 1 měsícem
rodič
revize
df56283f84

+ 2 - 1
src/main/java/com/adx/tencent/honor/controller/HonorTrackingController.java

@@ -7,6 +7,7 @@ import com.adx.tencent.honor.model.HonorBidRecord;
 import com.adx.tencent.honor.model.HonorTrackingRecord;
 import com.adx.tencent.honor.service.HonorPlacement;
 import com.adx.tencent.honor.store.HonorHotStore;
+import com.adx.tencent.util.TraceIds;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -299,7 +300,7 @@ public class HonorTrackingController {
     }
 
     private String honorTraceId(Map<String, String> params) {
-        return firstParam(params, "trackId");
+        return TraceIds.normalize(firstParam(params, "trackId"));
     }
 
     private static void copyAlias(Map<String, String> params, String target, String... aliases) {

+ 2 - 1
src/main/java/com/adx/tencent/httpapi/TrackingController.java

@@ -6,6 +6,7 @@ import com.adx.tencent.baidu.model.TrackingResult;
 import com.adx.tencent.storage.RedisHotStore;
 import com.adx.tencent.storage.model.BidRecord;
 import com.adx.tencent.storage.model.TrackingRecord;
+import com.adx.tencent.util.TraceIds;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -365,7 +366,7 @@ public class TrackingController {
         for (String key : List.of("click_id", "impression_id", "trace_id", "callback", "request_id",
                 "oaid", "imei", "idfa", "caid", "muid")) {
             String v = params.get(key);
-            if (v != null && !v.isBlank()) return v;
+            if (v != null && !v.isBlank()) return TraceIds.normalize(v);
         }
         return null;
     }

+ 2 - 1
src/main/java/com/adx/tencent/kuaishou/controller/KuaishouTrackingController.java

@@ -7,6 +7,7 @@ import com.adx.tencent.kuaishou.model.KuaishouBidRecord;
 import com.adx.tencent.kuaishou.model.KuaishouTrackingRecord;
 import com.adx.tencent.kuaishou.service.KuaishouPlacement;
 import com.adx.tencent.kuaishou.store.KuaishouHotStore;
+import com.adx.tencent.util.TraceIds;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -360,7 +361,7 @@ public class KuaishouTrackingController {
     }
 
     private String kuaishouTraceId(Map<String, String> params) {
-        return firstParam(params, "callback", "request_id", "idfaMD5", "idfa", "oaidMD5", "oaid", "imeiMD5", "imei");
+        return TraceIds.normalize(firstParam(params, "callback", "request_id", "idfaMD5", "idfa", "oaidMD5", "oaid", "imeiMD5", "imei"));
     }
 
     private void normalizeDeductionParams(Map<String, String> params) {

+ 37 - 0
src/main/java/com/adx/tencent/util/TraceIds.java

@@ -0,0 +1,37 @@
+package com.adx.tencent.util;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.HexFormat;
+
+public final class TraceIds {
+
+    private static final int MAX_TRACE_ID_LENGTH = 255;
+
+    private TraceIds() {
+    }
+
+    public static String normalize(String raw) {
+        if (raw == null) {
+            return null;
+        }
+        String value = raw.trim();
+        if (value.isEmpty()) {
+            return value;
+        }
+        if (value.length() <= MAX_TRACE_ID_LENGTH) {
+            return value;
+        }
+        return "md5:" + md5Hex(value);
+    }
+
+    private static String md5Hex(String value) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] hash = md.digest(value.getBytes(StandardCharsets.UTF_8));
+            return HexFormat.of().formatHex(hash);
+        } catch (Exception e) {
+            throw new RuntimeException("md5 unavailable", e);
+        }
+    }
+}