Skip to content

Commit 3cc2486

Browse files
committed
fix:修复高并发下Feign在黑名单中url添加请求头报错的问题
现在解决方案为添加对象锁,但是普通接口也有相似问题
1 parent 7816ab7 commit 3cc2486

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/SpyDispatcherImpl.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package io.dongtai.iast.core.handler.hookpoint;
22

3-
import io.dongtai.iast.core.AgentEngine;
43
import io.dongtai.iast.common.config.ConfigBuilder;
54
import io.dongtai.iast.common.config.ConfigKey;
65
import io.dongtai.iast.common.scope.Scope;
76
import io.dongtai.iast.common.scope.ScopeManager;
7+
import io.dongtai.iast.common.string.StringUtils;
8+
import io.dongtai.iast.core.AgentEngine;
89
import io.dongtai.iast.core.EngineManager;
910
import io.dongtai.iast.core.handler.bypass.BlackUrlBypass;
1011
import io.dongtai.iast.core.handler.hookpoint.api.DubboApiGatherThread;
@@ -17,7 +18,6 @@
1718
import io.dongtai.iast.core.handler.hookpoint.service.trace.DubboService;
1819
import io.dongtai.iast.core.handler.hookpoint.service.trace.FeignService;
1920
import io.dongtai.iast.core.handler.hookpoint.service.trace.HttpService;
20-
import io.dongtai.iast.common.string.StringUtils;
2121
import io.dongtai.iast.core.utils.matcher.ConfigMatcher;
2222
import io.dongtai.log.DongTaiLog;
2323
import io.dongtai.log.ErrorCode;
@@ -31,6 +31,7 @@
3131
import java.util.Enumeration;
3232
import java.util.HashMap;
3333
import java.util.Map;
34+
import java.util.concurrent.ConcurrentHashMap;
3435
import java.util.concurrent.atomic.AtomicInteger;
3536

3637
/**
@@ -768,11 +769,18 @@ public boolean isSkipCollectFeign(Object instance) {
768769
Object metadata = metadataField.get(instance);
769770
Method templateMethod = metadata.getClass().getMethod("template");
770771
Object template = templateMethod.invoke(metadata);
771-
772772
Method addHeaderMethod = template.getClass().getDeclaredMethod("header", String.class, String[].class);
773773
addHeaderMethod.setAccessible(true);
774-
addHeaderMethod.invoke(template, BlackUrlBypass.getHeaderKey(), new String[]{});
775-
addHeaderMethod.invoke(template, BlackUrlBypass.getHeaderKey(), new String[]{BlackUrlBypass.isBlackUrl().toString()});
774+
ConcurrentHashMap<String, Collection<String>> headers = new ConcurrentHashMap<>();
775+
synchronized (template){
776+
/*
777+
* @todo 在高并发情况下,由于SynchronousMethodHandler复用的原因,会导致多线程下同时修改的问题
778+
* 所以添加了对象锁,后续是否可以考虑更改为拦截器
779+
*/
780+
// addHeaderMethod.invoke(template, BlackUrlBypass.getHeaderKey(), new String[]{});
781+
// addHeaderMethod.invoke(template, BlackUrlBypass.getHeaderKey(), new String[]{BlackUrlBypass.isBlackUrl().toString()});
782+
addHeaderMethod.invoke(template, BlackUrlBypass.getHeaderKey(), new String[]{"true"});
783+
}
776784
} catch (NoSuchFieldException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
777785
DongTaiLog.error(ErrorCode.get("BYPASS_FAILED_FEIGN"), e);
778786
}

0 commit comments

Comments
 (0)