diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java index 3abf391e3..b82f028d7 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java @@ -63,14 +63,9 @@ public class DecodeTransferMetadataServletFilter extends OncePerRequestFilter { mergedTransitiveMetadata.putAll(internalTransitiveMetadata); mergedTransitiveMetadata.putAll(customTransitiveMetadata); - try { - MetadataContextHolder.init(mergedTransitiveMetadata); + MetadataContextHolder.init(mergedTransitiveMetadata); - filterChain.doFilter(httpServletRequest, httpServletResponse); - } - catch (IOException | ServletException | RuntimeException e) { - throw e; - } + filterChain.doFilter(httpServletRequest, httpServletResponse); } private Map getInternalTransitiveMetadata(HttpServletRequest httpServletRequest) { diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java index e92c526b3..e4ac40359 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java @@ -20,12 +20,21 @@ package com.tencent.cloud.common.metadata; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; +import static com.tencent.cloud.common.constant.MetadataConstant.INTERNAL_METADATA_DISPOSABLE; +import static com.tencent.cloud.common.util.JacksonUtils.deserialize2Map; +import static java.net.URLDecoder.decode; /** * Metadata Context Holder. @@ -34,6 +43,8 @@ import org.springframework.util.CollectionUtils; */ public final class MetadataContextHolder { + private static final Logger LOGGER = LoggerFactory.getLogger(MetadataContextHolder.class); + private static final ThreadLocal METADATA_CONTEXT = new InheritableThreadLocal<>(); private static MetadataLocalProperties metadataLocalProperties; @@ -89,6 +100,34 @@ public final class MetadataContextHolder { // Save transitive metadata to ThreadLocal. if (!CollectionUtils.isEmpty(dynamicTransitiveMetadata)) { + + // processing disposable keys + if (dynamicTransitiveMetadata.containsKey(INTERNAL_METADATA_DISPOSABLE)) { + String disposableKeyStatus = dynamicTransitiveMetadata.get(INTERNAL_METADATA_DISPOSABLE); + try { + if (StringUtils.hasText(disposableKeyStatus)) { + Map keyStatus = deserialize2Map(decode(disposableKeyStatus, UTF_8)); + Iterator> it = keyStatus.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + String key = entry.getKey(); + boolean status = Boolean.parseBoolean(entry.getValue()); + if (!status) { + keyStatus.put(key, "true"); + } + else { + // removed disposable key + dynamicTransitiveMetadata.remove(key); + it.remove(); + } + } + } + } + catch (Exception e) { + LOGGER.error("Runtime system does not support utf-8 coding.", e); + } + } + Map staticTransitiveMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); Map mergedTransitiveMetadata = new HashMap<>();