From 9d43c83ac235a59cc60b14096d22c323dc8cf696 Mon Sep 17 00:00:00 2001 From: cho Date: Fri, 23 Jan 2026 10:56:21 +0900 Subject: [PATCH] =?UTF-8?q?SimpleFrameworkFilter=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EA=B8=B0=EC=A1=B4=20=EB=8F=99=EC=9E=91=20?= =?UTF-8?q?=EA=B7=B8=EB=8C=80=EB=A1=9C,=20=EC=B6=94=EA=B0=80=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=94=84=EB=A1=9C=ED=8D=BC=ED=8B=B0?= =?UTF-8?q?=EA=B0=92=EC=9C=BC=EB=A1=9C=20=EB=8F=99=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=97=A4=EB=8D=94=ED=82=A4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B0=EC=9E=91=ED=95=A0=EC=88=98=20=EC=9E=88=EA=B2=8C?= =?UTF-8?q?=EB=81=94,?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AllHeaderFilter 추가 inboundHeader에서 들어오는 모든 헤더 넘기는 처리. 표준에서 사용하는 헤더(Content-Length..)들 그대로 넘기면 위험하니까 blackList 프로퍼티로 관리기능 추가. --- .../http/client/filter/AllHeaderFilter.java | 122 ++++++++++++++++++ .../HttpClient5AdapterFilterFactory.java | 5 +- .../filter/HttpClient5AdapterFilterType.java | 1 + .../client/filter/SimpleFrameworkFilter.java | 70 +++++----- 4 files changed, 161 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AllHeaderFilter.java diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AllHeaderFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AllHeaderFilter.java new file mode 100644 index 0000000..52413fb --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AllHeaderFilter.java @@ -0,0 +1,122 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Arrays; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; +import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + +public class AllHeaderFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String PROPERTIES_GROUP_NAME = "HttpHeaderFilter"; + public static final String HEADER_KEY_NAMES = "AllHeaderFilter.blackList"; + + + String[] HttpHeaderRelayBlackList = { + "Transfer-Encoding", + "Host", + "Authorization", + "Accept", + "Host", + "Cookie", + "Connection", + "Keep-Alive", + "Proxy-Authenticate", + "Proxy-Authorization", + "TE", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Content-Type", + "Content-Encoding", + "Content-Language", + "Content-Location", + "Content-MD5", + "Expect", + }; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("doPreFilter Processing Start."); + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + + Map inboundHeaderMap = getInboundHeaderProp(tempProp); + + String propValue = PropManager.getInstance().getProperty(PROPERTIES_GROUP_NAME, HEADER_KEY_NAMES, "").trim(); + + String[] userSettingBlackList = propValue.split(","); + + if( userSettingBlackList.length > 0 ) { + HttpHeaderRelayBlackList = Stream + .concat(Arrays.stream(HttpHeaderRelayBlackList), Arrays.stream(userSettingBlackList)) + .toArray(String[]::new); + } + + + for(String keyName : inboundHeaderMap.keySet() ) { + + if( StringUtils.equalsAnyIgnoreCase( keyName, HttpHeaderRelayBlackList ) ) { + logger.debug("Skip Processing Key ["+keyName+"], value ["+inboundHeaderMap.get(keyName)+"] in HttpHeaderRelayBlackList"); + continue; + } + + filterHeaders.put(keyName, inboundHeaderMap.get(keyName)); + logger.debug("Processing Key ["+keyName+"], value ["+inboundHeaderMap.get(keyName)+"]"); + } + + logger.debug("doPreFilter Processing End."); + + return message; + } + + public Map getInboundHeaderProp(Properties prop) { + Properties header = new Properties(); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + try { + Object headerObj = prop.get(HttpAdapterServiceKey.INBOUND_HEADER); + if (headerObj instanceof Properties) { //tomcat + header = (Properties) headerObj; + for (String name : header.stringPropertyNames()) { + inboundHeaderMap.put(name, header.getProperty(name)); + } + } else if (headerObj instanceof String) { //weblogic + String str = (String) headerObj; + str = str.substring(1, str.length() - 1); + // key=value 쌍 분리 + String[] entries = str.split(","); + for (String entry : entries) { + String[] kv = entry.split("=", 2); + if (kv.length == 2) { + inboundHeaderMap.put(kv[0].trim(), kv[1].trim()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return inboundHeaderMap; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java index a4f04ad..4a0aeae 100644 --- a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java @@ -50,7 +50,10 @@ public class HttpClient5AdapterFilterFactory { break; case ASYNCRESPONSE: filter = new AsyncReponseFilter(); - break; + break; + case ALLHEADER: + filter = new AllHeaderFilter(); + break; default: filter = classForName(type); if (filter == null) { diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java index ae21d7f..150f9c5 100644 --- a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java @@ -11,6 +11,7 @@ public enum HttpClient5AdapterFilterType { NICECREDIT, TOSSBANK, ASYNCRESPONSE, + ALLHEADER, UNKNOWN; public static HttpClient5AdapterFilterType getValue(String type) { diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java index 6af88ac..c7d8949 100644 --- a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java @@ -7,18 +7,14 @@ import java.util.TreeMap; import org.apache.commons.lang3.StringUtils; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; -import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; -import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.Logger; public class SimpleFrameworkFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); - public static final String CLIENTID = "clientId"; - public static final String TRACEID = "traceId"; - public static final String GUID = "guid"; - public static final String RECEIVEDTIMESTAMP = "receivedTimestamp"; - public static final String PARTNER_TRACE_ID = "partnerTraceId"; + public static final String PROPERTIES_GROUP_NAME = "HttpHeaderFilter"; + public static final String HEADER_KEY_NAMES = "SimpleFrameworkFilter"; @Override public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) @@ -32,38 +28,40 @@ public class SimpleFrameworkFilter implements HttpClientAdapterFilter, HttpAdapt tempProp.put("FILTERHEADER", filterHeaders); } - Map inboundHeaderMap = getInboundHeaderProp(tempProp); + String propValue = PropManager.getInstance().getProperty(PROPERTIES_GROUP_NAME, HEADER_KEY_NAMES, "").trim(); + + String[] headerKeyNames = propValue.split(","); + + if( StringUtils.isAnyBlank(headerKeyNames) ) { + headerKeyNames = new String[]{"clientId", "TRANSACTION_UUID", "GUID","INBOUND_REQUESTED_TIME","receivedTimestamp","partnerTraceId","X-LOAN-TOKEN"}; + } + + for(String headerKeyName : headerKeyNames) { + headerKeyName = headerKeyName.trim(); + } + + Map inboundHeaderMap = getInboundHeaderProp(tempProp); try { - /* 업체정보 */ - String clientId = tempProp.getProperty(HttpAdapterServiceSupport.PROPERTIES_NAME_CLIENT_ID); - if (StringUtils.isEmpty(clientId)) clientId = ""; - filterHeaders.put(CLIENTID, clientId); - logger.debug("SimpleFrameworkFilter] Processing Key ["+CLIENTID+"], value ["+clientId+"]"); - - /* APIM 거래추적자 */ - String uuid = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID, ""); - filterHeaders.put(TRACEID, uuid); - logger.debug("SimpleFrameworkFilter] Processing Key ["+TRACEID+"], value ["+uuid+"]"); - - /* GUID */ - String guid = tempProp.getProperty(TransactionContextKeys.GUID, ""); - filterHeaders.put(GUID, guid); - logger.debug("SimpleFrameworkFilter] Processing Key ["+GUID+"], value ["+guid+"]"); - - /* 최초요청시간 */ - String receivedTimestamp = tempProp.getProperty(HttpAdapterServiceKey.INBOUND_REQUESTED_TIME, ""); - filterHeaders.put(RECEIVEDTIMESTAMP, receivedTimestamp); - logger.debug("SimpleFrameworkFilter] Processing Key ["+RECEIVEDTIMESTAMP+"], value ["+receivedTimestamp+"]"); + for ( Object key : tempProp.keySet() ) { + String keyName = (String) key; + + if( StringUtils.equalsAnyIgnoreCase(keyName, headerKeyNames) ) { + String value = (String) tempProp.get(keyName); + filterHeaders.put(keyName, value); + logger.debug("SimpleFrameworkFilter] Processing Key ["+keyName+"], value ["+value+"]"); + } + } - String partnerTraceId = inboundHeaderMap.getOrDefault(PARTNER_TRACE_ID, ""); - filterHeaders.put(PARTNER_TRACE_ID, partnerTraceId); - logger.debug("SimpleFrameworkFilter] Processing Key ["+PARTNER_TRACE_ID+"], value ["+partnerTraceId+"]"); - - String x_loan_token = inboundHeaderMap.getOrDefault(TransactionContextKeys.X_LOAN_TOKEN, ""); - filterHeaders.put(TransactionContextKeys.X_LOAN_TOKEN, x_loan_token); - logger.debug("SimpleFrameworkFilter] Processing Key ["+TransactionContextKeys.X_LOAN_TOKEN+"], value ["+x_loan_token+"]"); - + for( String keyName : inboundHeaderMap.keySet() ) { + + if( StringUtils.equalsAnyIgnoreCase(keyName, headerKeyNames) ) { + String value = inboundHeaderMap.get(keyName); + filterHeaders.put(keyName, value); + logger.debug("SimpleFrameworkFilter] Processing Key ["+keyName+"], value ["+value+"]"); + } + + } } catch (Exception e) { logger.error(e.getMessage());