From 2b06607d52b8d5a613d77d3023f9acadfeb6023f Mon Sep 17 00:00:00 2001 From: jaewohong Date: Wed, 19 Nov 2025 16:02:29 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=EA=B0=9C=EB=B0=9C=EC=84=9C=EB=B2=84?= =?UTF-8?q?=EC=97=90=20push=EC=9C=84=ED=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApiAdapterController.java | 70 +++- .../adapter/service/ApiAdapterService.java | 299 +++++++++++++++++- 2 files changed, 353 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index 0b60677..0848696 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -33,6 +33,15 @@ import com.eactive.eai.common.util.Logger; import com.eactive.eai.common.util.MessageUtil; import com.eactive.eai.common.util.UUIDGenerator; import com.eactive.eai.inbound.error.InboundErrorInfoVO; +import com.kjbank.encrypt.exchange.crypto.AES256Cipher; +import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher; +import com.kjbank.encrypt.exchange.crypto.AESCipher; + +// jwhong +import org.json.simple.JSONObject; +import java.util.HashMap; +import java.util.Map; +import java.sql.Timestamp; @RestController public class ApiAdapterController implements HttpAdapterServiceKey { @@ -45,7 +54,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { * KBANK 요구사항으로 /api/v1/oauth/token 과 같은 형태로 토큰 발급거래를 수행해야해서 예외처리함 * @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer endpoints) */ - @RequestMapping(value = {"/api/*", "/api/*/{path:^(?!.*oauth).*$}/**"}) + @RequestMapping(value = {"/api/*", "/mapi/*", "/api/*/{path:^(?!.*oauth).*$}/**", "/mapi/*/{path:^(?!.*oauth).*$}/**"}) // @RequestMapping(value = {"/api/**"}) public ResponseEntity callApi(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception { // /ONLWeb/api/v1/public/getUserInfo.svc @@ -54,7 +63,16 @@ public class ApiAdapterController implements HttpAdapterServiceKey { apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath()); apiUri = StringUtils.removeEnd(apiUri, "/"); HttpDynamicInAdapterUri adptUri = findAdptUri(apiUri, HttpDynamicInAdapterManager.getInstance()); + + //Received time , jwhong + long receivedTimeMillis = System.currentTimeMillis(); + String receivedTimeStr = String.valueOf(receivedTimeMillis); + System.out.println("현재 시간 밀리초(long): " + receivedTimeMillis); + System.out.println("현재 시간 밀리초(String): " + receivedTimeStr); + //Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + //System.out.println("현재 Timestamp: " + timestamp); + if (logger.isDebug()) { logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI()); } @@ -85,10 +103,26 @@ public class ApiAdapterController implements HttpAdapterServiceKey { String responseType = httpProp.getProperty(RESPONSE_TYPE, "SYNC"); ResponseEntity responseEntity = null; Properties transactionProp = new Properties(); + //transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeMillis); // jwhong, put api received time + transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeStr); + try { String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); - if (RESPONSE_TYPE_ASYNC.equals(responseType)) { - responseEntity = ResponseEntity.ok("dummy"); + // if (RESPONSE_TYPE_ASYNC.equals(responseType)) { // table의 값이 ASYNC 로 들어가 있는데 response_type_async는 ASYN 로 되어 있어 아래처럼 비교함 jwhong 2025 + if ("ASYNC".equals(responseType)) { + //responseEntity = ResponseEntity.ok("dummy"); // comment by jwhong + servletResponse.addHeader("traceId", responseData); // uuid를 response header에 + int httpStatus = servletResponse.getStatus(); + if (httpStatus == 200) { + // 업체별 aync response message 가 다르다. + String asyncMsgStyle = httpProp.getProperty("ASYNC_RTNMSG_TYPE", "").toUpperCase(); + //String responseBody = makeResponseBodyMsg(asyncMsgStyle); + String responseBody = asyncMsgStyle; + responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseBody); + // jwhong + } else { + responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); + } } else { // responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); // 버즈빌 포인트 적립 처리하기 위하여 정상응답이더라도 응답코드(apiRsltCd) 값이 200이 아닌 경우 처리를 위하여 수정 @@ -186,5 +220,35 @@ public class ApiAdapterController implements HttpAdapterServiceKey { InboundErrorLogger.error(errorInfoVO); } + + private String makeResponseBodyMsg(String asyncMsgStyle) { + + Map dataMap = new HashMap<>(); + dataMap.put("result", 1); + Map map = new HashMap<>(); + + switch (asyncMsgStyle) { + case "TB_SUC": + map.put("rspCode", "TB_SUC_000"); + map.put("rspMsg", "정상"); + map.put("data", dataMap); + break; + case "ONLYDATA": + map.put("data", dataMap); + map.put("success", "true"); + break; + default: + map.put("code", "200"); + map.put("data", dataMap); + map.put("message", "정상 처리 되었습니다."); + break; + } + + JSONObject json = new JSONObject(); + json.putAll(map); + + return json.toJSONString(); + } + } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index 77b80b4..2937209 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -7,6 +7,7 @@ import com.eactive.eai.adapter.Keys; import com.eactive.eai.adapter.http.HttpMemoryLogger; import com.eactive.eai.adapter.http.HttpMethodType; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; +import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthFilter; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.util.CommonLib; @@ -24,6 +25,7 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.mina.common.ByteBuffer; import org.json.simple.JSONObject; import org.json.simple.JSONValue; +import org.json.simple.parser.JSONParser; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; @@ -40,6 +42,7 @@ import java.util.*; import com.eactive.eai.authserver.service.OAuth2Manager; import com.kjbank.encrypt.exchange.crypto.AES256Cipher; import com.kjbank.encrypt.exchange.crypto.AESCipher; +import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher; import java.nio.charset.StandardCharsets; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -47,12 +50,15 @@ import java.io.ObjectOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import org.springframework.security.oauth2.provider.ClientDetails; +import com.nimbusds.jwt.SignedJWT; + @Service public class ApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); public static final String HEADER_GROUP = "HEADER_GROUP"; + public static final String HTTP_STATUS = "HTTP_STATUS"; // jwhong // HEADER_GROUP JSON에 추가할 항목 정의, 없으면 전체 header 추가 public static final String HEADER_KEYS = "HEADER_KEYS"; public static final String PROPERTIES_NAME_HTTP_REQUEST_METHOD = "httpRequestMethod"; @@ -61,6 +67,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { private static final String JSON_FIELD_NAME = "json-body"; private static final String FILE_GROUP_NAME = "image-file"; private static final String UPLOAD_ROOT_PATH = "UPLOAD_ROOT_PATH"; + public static final String PAYLOAD_PARAM_NAME_CLIENT_ID = "client_id"; // jwhong public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, AdapterGroupVO adapterGroupVO, AdapterVO adapterVO, Properties transactionProp) throws Exception { int traceLevel = 0; @@ -105,10 +112,14 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { transactionProp.put(ENC_PATHS, httpProp.getProperty(ENC_PATHS, "")); transactionProp.put(ENCRYPT_ALGORITHM, httpProp.getProperty(ENCRYPT_ALGORITHM, "")); //jwhong - transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); // jwhong + if (getHeaders(request).get(HEADER_NAME_CLIENT_ID) != null) { // jwhong + transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); + } transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); //jwhong //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put + transactionProp.put(ENCRYPT_AES256_IV, httpProp.getProperty(ENCRYPT_AES256_IV, "")); //jwhong + transactionProp.put(ENCRYPT_AES256_KEY, httpProp.getProperty(ENCRYPT_AES256_KEY, "")); //jwhong try { @@ -218,7 +229,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { paramValue = ""; } else { // jwhong decrypt - paramValue = doPreDecryption(paramValue, transactionProp); + paramValue = doPreDecryption(paramValue, transactionProp, request); } if ("Y".equals(urlDecodeYn) && isParameterType) { @@ -262,7 +273,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { } } } - + if (headerJson.size() > 0) { jsonMessage.put(headerGroupName, headerJson); message = jsonMessage.toJSONString(); @@ -284,6 +295,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { stopWatch.stop(); String syncAsyncType = transactionProp.getProperty(INBOUND_SYNC_ASYNC_TYPE); + if (!"ASYN".equals(syncAsyncType) && MessageType.JSON.equals(adptMsgType) && StringUtils.isNotBlank(headerGroupName)) { ObjectMapper mapper = new ObjectMapper(); ObjectNode rootNode = (ObjectNode) mapper.readTree(result); @@ -298,19 +310,67 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { result = mapper.writeValueAsString(rootNode); } } - + + // KJBank는 요청에 대한 응답 (Sync응답, Aync 에 대한 Ack응답) 에 대하여 암호화 하지 않는다. 무조건 안한다. 따라서 아래부분은 구현은 했지만 사용하지 않는다. + //result = doPostEncryption(result, transactionProp); // jwhong Encrypt return result; } - // jwhong encrypt + // jwhong decrypt - private String doPreDecryption(String eaiBody, Properties transactionProp) { + private String doPreDecryption(String eaiBody, Properties transactionProp, HttpServletRequest request) { + String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); + String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong + String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); + //String inboundToken2 = transactionProp.getProperty(INBOUND_TOKEN, ""); // 이건 token 값이 아니고 authorization 값이다 + String inboundToken = ""; + + String secretAES256Iv = transactionProp.getProperty("ENCRYPT_AES256_IV"); + String secretAES256Key = transactionProp.getProperty("ENCRYPT_AES256_KEY"); + + if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 + return eaiBody; + } + + inboundToken = JwtTokenExtractor(request); + xElinkClientId = JwtClientIdExtractor(inboundToken); // token에서 client id를 추출함 + + // 암호화 key를 token 내용으로 할지 client secret 내용으로 할지 결정함. adapter property에 정의함 + // ENCRYPT_ALGORITHM 을 설정했는데 ENCRYPT_BASE_TYPE을 설정안하면 Decrypt 수행시 Exception 발생함 + String clientSecret = ""; + if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) { + clientSecret = inboundToken; + } else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) { + OAuth2Manager manager = OAuth2Manager.getInstance(); + ClientDetails clientDetail = manager.getClientDeatilsStore().get(xElinkClientId); + + if ( clientDetail != null ) { // 여기서 not null 이라는 것은 apim oauth server에서 발급된 token 임. + // 즉 KJBank 에서 요청이 들어온 것이다. + clientSecret = clientDetail.getClientSecret(); + } // 그럼 업체에서 요청이 들어오면?? 업체도 apim oauth server에서 발급된 token을 사용하는것이다. + } + + byte[] decryptedMessage = null; + decryptedMessage = doInboundPreDecrypt(eaiBody, decryptAlgorithm,clientSecret,secretAES256Iv, secretAES256Key ); + + String resultMessage = new String(decryptedMessage, StandardCharsets.UTF_8 ); + return resultMessage; + //return new String(decryptedMessage, StandardCharsets.UTF_8 ); + } + + + // jwhong encrypt + private String doPostEncryption(String eaiBody, Properties transactionProp) { String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); String inboundToken = transactionProp.getProperty(INBOUND_TOKEN, ""); + String secretAES256Iv = transactionProp.getProperty("ENCRYPT_AES256_IV"); + String secretAES256Key = transactionProp.getProperty("ENCRYPT_AES256_KEY"); + + if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 return eaiBody; } @@ -330,7 +390,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { } byte[] decryptedMessage = null; - decryptedMessage = doInboundPreDecrypt(eaiBody, decryptAlgorithm,clientSecret); + decryptedMessage = doInboundPostEncrypt(eaiBody, decryptAlgorithm,clientSecret,secretAES256Iv, secretAES256Key ); String resultMessage = new String(decryptedMessage, StandardCharsets.UTF_8 ); return resultMessage; @@ -366,11 +426,13 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { } - private byte[] doInboundPreDecrypt(String eaiStringBody, String decryptAlgorithm, String clientSecretKey) { + private byte[] doInboundPreDecrypt(String eaiStringBody, String decryptAlgorithm, String clientSecretKey, String secretAES256Iv, String secretAES256Key) { byte[] decryptedMessage = null; //String eaiStringBody = new String(eaiBody, StandardCharsets.UTF_8); + eaiStringBody = extractBodyMsg(decryptAlgorithm, eaiStringBody); + //test source //System.out.println("eaiBody 바이트 배열 길이: " + eaiBody.length); System.out.println("Base64 문자열: " + eaiStringBody); @@ -387,10 +449,20 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { // end test source switch (decryptAlgorithm) { - case "AES128": - - String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? + case "AES128-TOSS": try { + String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? + //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); + String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); + } + break; + case "AES128-TOGETHER": + try { + String key128 = clientSecretKey.substring(44,60); //togetherEncoder 경우는 substring(44,60) 이네?? //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); @@ -400,8 +472,8 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { } break; case "AES256": - String key = clientSecretKey.substring(10,42); try { + String key = clientSecretKey.substring(10,42); String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, key); decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); } catch (Exception e) { @@ -409,9 +481,41 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); } break; + case "AES256-KAKAO": + try { + String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, secretAES256Iv, secretAES256Key); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + case "AES256-TOSS": + try { + String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, secretAES256Iv, secretAES256Key); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + + case "AES256GCM": + try { + byte[] key = AES256GCMCipher.generateKey(); + AES256GCMCipher cipher = new AES256GCMCipher(key); + byte[] aad = "metadata".getBytes(); + + String decryptedStrMessage = cipher.decrypt(eaiStringBody , aad); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256GCM Encryption error=" + e.getMessage()); + } + break; default: try { - //decryptedMessage = Arrays.copyOf(eaiBody, eaiBody.length); decryptedMessage = eaiStringBody.getBytes(); } catch (Exception e) { e.printStackTrace(); @@ -423,6 +527,175 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { return decryptedMessage; } + private String extractBodyMsg(String decryptAlgorithm, String eaiStringBody) { + + String decryptedJsonKey = ""; + String decryptedBodyMessage = ""; + + switch (decryptAlgorithm) { + case "AES128-TOSS": + decryptedJsonKey = "preScreeningRequest"; + break; + case "AES128-TOGETHER": + decryptedJsonKey = "obpTxData"; + break; + case "AES256": + decryptedJsonKey = "preScreeningRequest"; + break; + case "AES256-KAKAO": + decryptedJsonKey = "encrypted_data"; + break; + case "AES256-TOSS": + decryptedJsonKey = "encryptedData"; + break; + case "AES256GCM": + break; + default: + break; + } + + try { + JSONParser parser = new JSONParser(); + JSONObject jsonObject = (JSONObject) parser.parse(eaiStringBody); + decryptedBodyMessage = (String) jsonObject.get(decryptedJsonKey); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClient5AdapterServiceRest] extractBodyMsg error : " + e.getMessage()); + } + + return decryptedBodyMessage; + + } + + private byte[] doInboundPostEncrypt(String eaiStringBody, String encryptAlgorithm, String clientSecretKey, String secretAES256Iv, String secretAES256Key) { + + byte[] encryptedMessage = null; + //String eaiStringBody = new String(eaiBody, StandardCharsets.UTF_8); + + //test source + //System.out.println("eaiBody 바이트 배열 길이: " + eaiBody.length); + System.out.println("Base64 문자열: " + eaiStringBody); + System.out.println("Base64 문자열 길이: " + eaiStringBody.length()); + System.out.println("Base64 문자열 끝: " + eaiStringBody.substring(eaiStringBody.length() - 10)); + + // Base64 디코딩 테스트 + try { + byte[] decoded = Base64.getDecoder().decode(eaiStringBody); + System.out.println("디코딩 성공, 길이: " + decoded.length); + } catch (IllegalArgumentException e) { + System.out.println("Base64 디코딩 실패: " + e.getMessage()); + } + // end test source + + switch (encryptAlgorithm) { + case "AES128-TOSS": + try { + String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? + String decryptedStrMessage = AESCipher.encrypt(eaiStringBody, key128); + encryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); + } + break; + case "AES128-TOGETHER": + try { + String key128 = clientSecretKey.substring(44,60); //togetherEncoder 경우는 substring(44,60) 이네?? + String decryptedStrMessage = AESCipher.encrypt(eaiStringBody, key128); + encryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); + } + break; + case "AES256": + try { + String key = clientSecretKey.substring(10,42); + String decryptedStrMessage = AES256Cipher.encrypt(eaiStringBody, key); + encryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + case "AES256-KAKAO": + try { + String decryptedStrMessage = AES256Cipher.encrypt(eaiStringBody, secretAES256Iv, secretAES256Key); + encryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + case "AES256-TOSS": + try { + String decryptedStrMessage = AES256Cipher.encrypt(eaiStringBody, secretAES256Iv, secretAES256Key); + encryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + + case "AES256GCM": + try { + byte[] key = AES256GCMCipher.generateKey(); + AES256GCMCipher cipher = new AES256GCMCipher(key); + byte[] aad = "metadata".getBytes(); + + String decryptedStrMessage = cipher.encrypt(eaiStringBody , aad); + encryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256GCM Encryption error=" + e.getMessage()); + } + break; + default: + try { + encryptedMessage = eaiStringBody.getBytes(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] doOutboundPostFilter Array copy error=" + e.getMessage()); + } + break; + } + + return encryptedMessage; + } + + + + private String JwtTokenExtractor(HttpServletRequest request) { + + String Token = ""; + try { + Token = JwtAuthFilter.extractJWTToken(request); + } catch (Exception e) { + logger.error(e.getMessage()); + } + + System.out.println("Token is: " + Token); + return Token; + + } + + private String JwtClientIdExtractor(String inboundToken) { + + String tokenClientId =""; + try { + SignedJWT signedJWT = SignedJWT.parse(inboundToken); + tokenClientId = (String) signedJWT.getJWTClaimsSet().getClaim(PAYLOAD_PARAM_NAME_CLIENT_ID); + } catch (Exception e) { + logger.error(e.getMessage()); + tokenClientId = ""; + } + + System.out.println("Token Client ID: " + tokenClientId); + return tokenClientId; + + } + // jwhong until here From d808ce9958e5e54816aacfdf00aaa86aa5c3cb71 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Wed, 19 Nov 2025 16:17:01 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=EA=B0=9C=EB=B0=9C=EC=84=9C=EB=B2=84?= =?UTF-8?q?=EC=97=90=20push=EC=9C=84=ED=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eactive/eai/adapter/controller/ApiAdapterController.java | 4 +++- .../com/eactive/eai/adapter/service/ApiAdapterService.java | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index 0848696..b4bba6e 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -49,7 +49,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { @Autowired ApiAdapterService service; - + /** * KBANK 요구사항으로 /api/v1/oauth/token 과 같은 형태로 토큰 발급거래를 수행해야해서 예외처리함 * @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer endpoints) @@ -221,6 +221,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { InboundErrorLogger.error(errorInfoVO); } +/* private String makeResponseBodyMsg(String asyncMsgStyle) { Map dataMap = new HashMap<>(); @@ -249,6 +250,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { return json.toJSONString(); } + */ } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index 2937209..8a87a13 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -76,7 +76,6 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String adptGrpName = adapterGroupVO.getName(); String adptName = adapterVO.getName(); - String urlDecodeYn = httpProp.getProperty(URL_DECODE_YN, "N"); String encode = StringUtils.defaultIfBlank(adapterGroupVO.getMessageEncode(), "UTF-8"); From 640ece639f69f031e7db8d9192b8258391b03249 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Thu, 20 Nov 2025 17:26:53 +0900 Subject: [PATCH 03/10] =?UTF-8?q?async=20defalt=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApiAdapterController.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index b4bba6e..82c5c7f 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -116,8 +116,12 @@ public class ApiAdapterController implements HttpAdapterServiceKey { if (httpStatus == 200) { // 업체별 aync response message 가 다르다. String asyncMsgStyle = httpProp.getProperty("ASYNC_RTNMSG_TYPE", "").toUpperCase(); - //String responseBody = makeResponseBodyMsg(asyncMsgStyle); - String responseBody = asyncMsgStyle; + String responseBody =""; + if (asyncMsgStyle == null || asyncMsgStyle.trim().isEmpty()) { + responseBody = makeResponseBodyMsg(); + } else { + responseBody = asyncMsgStyle; + } responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseBody); // jwhong } else { @@ -221,6 +225,23 @@ public class ApiAdapterController implements HttpAdapterServiceKey { InboundErrorLogger.error(errorInfoVO); } + + private String makeResponseBodyMsg() { + + Map dataMap = new HashMap<>(); + dataMap.put("result", 1); + Map map = new HashMap<>(); + + map.put("code", "200"); + map.put("data", dataMap); + map.put("message", "정상 처리 되었습니다."); + + JSONObject json = new JSONObject(); + json.putAll(map); + + return json.toJSONString(); + } + /* private String makeResponseBodyMsg(String asyncMsgStyle) { From 6ae1dd230dbd27d423190031264f1bf0645aab1d Mon Sep 17 00:00:00 2001 From: eactive Date: Fri, 21 Nov 2025 11:44:37 +0900 Subject: [PATCH 04/10] =?UTF-8?q?HTTP,=20SOCKET=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20JSP=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/host/adapter_socket2_agent1.jsp | 114 ++++++++++++++++++ .../agent/host/adapter_socket2_agent2.jsp | 81 +++++++++++++ .../agent/host/adapter_socket2_startstop.jsp | 54 +++++++++ 3 files changed, 249 insertions(+) create mode 100644 WebContent/agent/host/adapter_socket2_agent1.jsp create mode 100644 WebContent/agent/host/adapter_socket2_agent2.jsp create mode 100644 WebContent/agent/host/adapter_socket2_startstop.jsp diff --git a/WebContent/agent/host/adapter_socket2_agent1.jsp b/WebContent/agent/host/adapter_socket2_agent1.jsp new file mode 100644 index 0000000..6eac161 --- /dev/null +++ b/WebContent/agent/host/adapter_socket2_agent1.jsp @@ -0,0 +1,114 @@ + +<%@ page contentType="text/xml; charset=utf-8"%> +<%@ page import="com.eactive.eai.adapter.socket2.config.MonitoringUtil"%> +<%@ page import="java.util.*,com.eactive.eai.common.util.Logger" %> + + + + + + + + + + + + + + + + + + +<%! + static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); +%> + +<% + // + // Socket2 status info + + + String eaiSvrInstNm = request.getParameter("eaiSvrInstNm"); + String adapterGroupName = request.getParameter("adapterGroupName"); + + if (eaiSvrInstNm == null) + eaiSvrInstNm = ""; + + if (adapterGroupName == null) + adapterGroupName = ""; + + String stateColor = ""; + String stateText = ""; + + String startColor = ""; + String startText = ""; + String startStop = ""; + + + String[][] arrList = null ; + try { + if(adapterGroupName.length() > 0) { + arrList = MonitoringUtil.adapterStatus(adapterGroupName); + } + else { + arrList = MonitoringUtil.adapterList1(); + } + } catch ( Exception e ) { + if (logger.isError()){ + logger.error(e.toString()); + } + } + + // ϵ arrList null ƴϸ鼭 迭̰ 0 Exception ߻ + // ʵ ϱ . (2008-06-30) + if( arrList == null || arrList.length == 0 ) { +%> + + <%=eaiSvrInstNm%> + + + + + + + + + + + + + +<% + + } else { + int col = arrList[0].length ; + int row = arrList.length ; + + for( int i = 0 ; i < row ; i++ ) { + out.println(""); + out.println("" + eaiSvrInstNm + ""); + for( int j = 0 ; j < col ; j++ ) { + if(j == 2) { + out.println(""); + } else { + out.println("" + arrList[i][j] + ""); + } + } + + // ׼ + if(arrList[i] != null && arrList[i].length > 4 ) { + if( "STARTED".equals(arrList[i][7]) || "STARTING".equals(arrList[i][7])) { + startStop = "03" ; // stop + } else { + startStop = "01" ; // start + } + } + + out.println(""+ startStop +""); + out.println(""); + } + } +%> + + diff --git a/WebContent/agent/host/adapter_socket2_agent2.jsp b/WebContent/agent/host/adapter_socket2_agent2.jsp new file mode 100644 index 0000000..6daf110 --- /dev/null +++ b/WebContent/agent/host/adapter_socket2_agent2.jsp @@ -0,0 +1,81 @@ + +<%@ page contentType="text/xml; charset=utf-8"%> +<%@ page import="com.eactive.eai.adapter.socket2.config.MonitoringUtil"%> +<%@ page import="java.util.*,com.eactive.eai.common.util.Logger" %> + + + + + + + + + + + + + + + + +<%! + static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); +%> +<% + // + // Socket2 connection info + + String eaiSvrInstNm = request.getParameter("eaiSvrInstNm"); + + if (eaiSvrInstNm == null) + eaiSvrInstNm = ""; + + String stateColor = ""; + String stateText = ""; + + String startColor = ""; + String startText = ""; + String startStop = ""; + + String[][] arrList = null ; + try { + arrList = MonitoringUtil.adapterList2(); + } catch ( Exception e ) { + if (logger.isError()){ + logger.error(e.toString()); + } + } + + // ϵ arrList null ƴϸ鼭 迭̰ 0 Exception ߻ + // ʵ ϱ . (2008-06-30) + if( arrList == null || arrList.length == 0 ) { +%> + + <%=eaiSvrInstNm%> + + + + + + + + + +<% + + } else { + int col = arrList[0].length ; + int row = arrList.length ; + for( int i = 0 ; i < row ; i++ ) { + out.println(""); + out.println("" + eaiSvrInstNm + ""); + + for( int j = 0 ; j < col ; j++ ) { + out.println("" + arrList[i][j] + ""); + } + out.println(""); + } + } +%> + + \ No newline at end of file diff --git a/WebContent/agent/host/adapter_socket2_startstop.jsp b/WebContent/agent/host/adapter_socket2_startstop.jsp new file mode 100644 index 0000000..6d7b74e --- /dev/null +++ b/WebContent/agent/host/adapter_socket2_startstop.jsp @@ -0,0 +1,54 @@ +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ page import="com.eactive.eai.adapter.socket2.config.MonitoringUtil"%> +<%@ page import="com.eactive.eai.common.util.CharsetDecoderUtil" %> +<%@ page import="java.util.*,com.eactive.eai.common.util.Logger" %> +<%! + static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); +%> +<% + // + // Socket2 adapter start/stop command + + String adapterGroupName = request.getParameter("adapterGroupName"); + String adapterName = request.getParameter("adapterName"); + String cmd = request.getParameter("cmd"); + + if( adapterGroupName == null ) { + adapterGroupName = "" ; + } + + if( adapterName == null ) { + adapterName = "" ; + } + + if( cmd == null ) { + cmd = "" ; + } + + + String retMsg = null ; + try { + if( cmd.equals("start") ) { + MonitoringUtil.adapterStart(adapterGroupName, adapterName); + retMsg = "true" ; + } else if( cmd.equals("stop") ) { + MonitoringUtil.adapterStop(adapterGroupName, adapterName); + retMsg = "true" ; + } else { + retMsg = "Unknown command error :" + cmd ; + } + } catch ( Exception e ) { + if (logger.isError()){ + logger.error("MonitoringUtil.adapterStart|adapterStop(" + adapterGroupName + ", " + adapterName + ")" ); + } + //e.printStackTrace(new java.io.PrintWriter(out)); + retMsg = "false" ; + } + + if( retMsg == null ) + retMsg = "" ; + + + + out.println( CharsetDecoderUtil.toKor(retMsg) ); +%> From 115f3a3301a68f9c0a7ff31438302d664cede5eb Mon Sep 17 00:00:00 2001 From: jaewohong Date: Tue, 25 Nov 2025 16:23:18 +0900 Subject: [PATCH 05/10] =?UTF-8?q?adapter=EA=B0=9D=EC=B2=B4=20=EB=AA=BB?= =?UTF-8?q?=EC=B0=BE=EC=98=A4=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApiAdapterController.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index 82c5c7f..5a784f0 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -27,6 +27,8 @@ import com.eactive.eai.adapter.service.ApiAdapterService; import com.eactive.eai.common.TransactionContextKeys; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.server.EAIServerManager; +import com.eactive.eai.common.stdmessage.STDMessageDAO; +import com.eactive.eai.common.util.ApplicationContextProvider; import com.eactive.eai.common.util.DatetimeUtil; import com.eactive.eai.common.util.InboundErrorLogger; import com.eactive.eai.common.util.Logger; @@ -42,6 +44,7 @@ import org.json.simple.JSONObject; import java.util.HashMap; import java.util.Map; import java.sql.Timestamp; +import com.eactive.eai.data.entity.onl.stdmessage.StandardMessageInfo; @RestController public class ApiAdapterController implements HttpAdapterServiceKey { @@ -62,16 +65,12 @@ public class ApiAdapterController implements HttpAdapterServiceKey { // /api/v1/public/getUserInfo.svc apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath()); apiUri = StringUtils.removeEnd(apiUri, "/"); + HttpDynamicInAdapterUri adptUri = findAdptUri(apiUri, HttpDynamicInAdapterManager.getInstance()); //Received time , jwhong long receivedTimeMillis = System.currentTimeMillis(); String receivedTimeStr = String.valueOf(receivedTimeMillis); - - System.out.println("현재 시간 밀리초(long): " + receivedTimeMillis); - System.out.println("현재 시간 밀리초(String): " + receivedTimeStr); - //Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - //System.out.println("현재 Timestamp: " + timestamp); if (logger.isDebug()) { logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI()); @@ -105,7 +104,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { Properties transactionProp = new Properties(); //transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeMillis); // jwhong, put api received time transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeStr); - + try { String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); // if (RESPONSE_TYPE_ASYNC.equals(responseType)) { // table의 값이 ASYNC 로 들어가 있는데 response_type_async는 ASYN 로 되어 있어 아래처럼 비교함 jwhong 2025 @@ -171,15 +170,26 @@ public class ApiAdapterController implements HttpAdapterServiceKey { * @param apiUri * @return */ - private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager) { + private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager) throws Exception { if (StringUtils.isBlank(apiUri)) { return null; } + + //** + STDMessageDAO dao = ApplicationContextProvider.getContext().getBean(STDMessageDAO.class); + StandardMessageInfo stdInfo = dao.getSTDMsgByPath(apiUri); + String serviceKey = stdInfo.getBzwksvckeyname(); + int idx = serviceKey.indexOf(":"); + String adapterGrpName = (idx != -1) ? serviceKey.substring(0, idx) : serviceKey; // ':' 이전 문자열 추출 + //*** for (int i = 0; i < 10; i++) { HttpDynamicInAdapterUri adptUri = manager.getAdptUri(apiUri); if (adptUri != null) { - return adptUri; + if (adptUri.getAdptGrpName().equals(adapterGrpName)) { + return adptUri; + } + //return adptUri; } // /api/v1/public From 694878155bb02051e6da2b3e8af51f26612089fc Mon Sep 17 00:00:00 2001 From: jaewohong Date: Tue, 25 Nov 2025 16:26:33 +0900 Subject: [PATCH 06/10] =?UTF-8?q?adapter=EA=B0=9D=EC=B2=B4=20=EB=AA=BB?= =?UTF-8?q?=EC=B0=BE=EC=98=A4=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eactive/eai/adapter/controller/ApiAdapterController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index 5a784f0..da58cfa 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -175,7 +175,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { return null; } - //** + //** jwhong TSEAIHS04의 api full path와 비교하여 adapter를 가져온다 STDMessageDAO dao = ApplicationContextProvider.getContext().getBean(STDMessageDAO.class); StandardMessageInfo stdInfo = dao.getSTDMsgByPath(apiUri); String serviceKey = stdInfo.getBzwksvckeyname(); From f57b1fe5f234e1bdbaa2bb70719e77b978b4639e Mon Sep 17 00:00:00 2001 From: jaewohong Date: Tue, 25 Nov 2025 16:41:49 +0900 Subject: [PATCH 07/10] =?UTF-8?q?HttpDynamicInAdapterUrl()=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eactive/eai/adapter/controller/ApiAdapterController.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index da58cfa..1c66bf1 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -180,7 +180,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { StandardMessageInfo stdInfo = dao.getSTDMsgByPath(apiUri); String serviceKey = stdInfo.getBzwksvckeyname(); int idx = serviceKey.indexOf(":"); - String adapterGrpName = (idx != -1) ? serviceKey.substring(0, idx) : serviceKey; // ':' 이전 문자열 추출 + String adapterGrpName = (idx != -1) ? serviceKey.substring(0, idx) : serviceKey; // ':' 이전 문자열 추출 //*** for (int i = 0; i < 10; i++) { @@ -188,8 +188,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey { if (adptUri != null) { if (adptUri.getAdptGrpName().equals(adapterGrpName)) { return adptUri; - } - //return adptUri; + } } // /api/v1/public From a92e15e88404c8d04faa2843a9b9922377bbafa7 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Thu, 4 Dec 2025 13:22:35 +0900 Subject: [PATCH 08/10] =?UTF-8?q?uri=20full=20path=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApiAdapterController.java | 66 ++++++++++++------- .../adapter/service/ApiAdapterService.java | 3 + 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index 1c66bf1..6c36043 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -35,15 +35,11 @@ import com.eactive.eai.common.util.Logger; import com.eactive.eai.common.util.MessageUtil; import com.eactive.eai.common.util.UUIDGenerator; import com.eactive.eai.inbound.error.InboundErrorInfoVO; -import com.kjbank.encrypt.exchange.crypto.AES256Cipher; -import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher; -import com.kjbank.encrypt.exchange.crypto.AESCipher; // jwhong import org.json.simple.JSONObject; import java.util.HashMap; import java.util.Map; -import java.sql.Timestamp; import com.eactive.eai.data.entity.onl.stdmessage.StandardMessageInfo; @RestController @@ -64,14 +60,27 @@ public class ApiAdapterController implements HttpAdapterServiceKey { String apiUri = servletRequest.getRequestURI(); // /api/v1/public/getUserInfo.svc apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath()); - apiUri = StringUtils.removeEnd(apiUri, "/"); - - HttpDynamicInAdapterUri adptUri = findAdptUri(apiUri, HttpDynamicInAdapterManager.getInstance()); - - //Received time , jwhong - long receivedTimeMillis = System.currentTimeMillis(); - String receivedTimeStr = String.valueOf(receivedTimeMillis); - + apiUri = StringUtils.removeEnd(apiUri, "/"); + + //** jwhong TSEAIHS04의 api full path와 비교하여 adapter를 가져온다 + String methodAndUri = servletRequest.getMethod() + "|" + apiUri; + HttpDynamicInAdapterUri adptUri = null; + String adapterGrpName =""; + String apiSvcCode = ""; + try { + STDMessageDAO dao = ApplicationContextProvider.getContext().getBean(STDMessageDAO.class); + StandardMessageInfo stdInfo = dao.getSTDMsgByPath(methodAndUri); + String serviceKey = stdInfo.getBzwksvckeyname(); + int idx = serviceKey.indexOf(":"); + adapterGrpName = (idx != -1) ? serviceKey.substring(0, idx) : serviceKey; // ':' 이전 문자열 추출 + apiSvcCode = stdInfo.getEaisvcname(); + //아래 원래 Logic + adptUri = findAdptUri(apiUri, HttpDynamicInAdapterManager.getInstance(), adapterGrpName); + } catch (Exception e) { + adptUri = null; + } + //*** + if (logger.isDebug()) { logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI()); } @@ -80,8 +89,11 @@ public class ApiAdapterController implements HttpAdapterServiceKey { logError(servletRequest); // throw new Exception("can not find Adapter Uri"); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("can not find Adapter Uri"); - } - + } + + //Received time , jwhong + long receivedTimeMillis = System.currentTimeMillis(); // 밀리세컨 단위로 보내야함 + String receivedTimeStr = String.valueOf(receivedTimeMillis); String adapterGroupName = adptUri.getAdptGrpName(); String adapterName = adptUri.getAdptName(); @@ -102,8 +114,9 @@ public class ApiAdapterController implements HttpAdapterServiceKey { String responseType = httpProp.getProperty(RESPONSE_TYPE, "SYNC"); ResponseEntity responseEntity = null; Properties transactionProp = new Properties(); - //transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeMillis); // jwhong, put api received time + // jwhong, put api received time, eaiSvcCode transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeStr); + transactionProp.put(API_SERVICE_CODE, apiSvcCode); try { String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); @@ -170,18 +183,23 @@ public class ApiAdapterController implements HttpAdapterServiceKey { * @param apiUri * @return */ - private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager) throws Exception { + private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager, String adapterGrpName) throws Exception { if (StringUtils.isBlank(apiUri)) { return null; - } + } - //** jwhong TSEAIHS04의 api full path와 비교하여 adapter를 가져온다 - STDMessageDAO dao = ApplicationContextProvider.getContext().getBean(STDMessageDAO.class); - StandardMessageInfo stdInfo = dao.getSTDMsgByPath(apiUri); - String serviceKey = stdInfo.getBzwksvckeyname(); - int idx = serviceKey.indexOf(":"); - String adapterGrpName = (idx != -1) ? serviceKey.substring(0, idx) : serviceKey; // ':' 이전 문자열 추출 - //*** + //* manager 출력 + logger.warn("===== adptUriMap 상세 내용 ====="); + for (Map.Entry entry : manager.adptUriMap.entrySet()) { + HttpDynamicInAdapterUri uriObj = entry.getValue(); + logger.warn("GroupName=" + uriObj.getAdptGrpName() + + ", AdapterName=" + uriObj.getAdptName() + + ", URI=" + uriObj.getUri()); + } + logger.warn("================================"); + + + // for (int i = 0; i < 10; i++) { HttpDynamicInAdapterUri adptUri = manager.getAdptUri(apiUri); diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index 8a87a13..5a0df56 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -448,6 +448,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { // end test source switch (decryptAlgorithm) { + case "AES128": case "AES128-TOSS": try { String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? @@ -532,6 +533,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String decryptedBodyMessage = ""; switch (decryptAlgorithm) { + case "AES128": case "AES128-TOSS": decryptedJsonKey = "preScreeningRequest"; break; @@ -587,6 +589,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { // end test source switch (encryptAlgorithm) { + case "AES128": case "AES128-TOSS": try { String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? From 3b1adbd7b2db7739be8ea46c687b90997ad415d6 Mon Sep 17 00:00:00 2001 From: Rinjae Date: Thu, 4 Dec 2025 13:39:10 +0900 Subject: [PATCH 09/10] Edit weblogic-web.xml --- WebContent/WEB-INF/weblogic-web.xml | 36 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/WebContent/WEB-INF/weblogic-web.xml b/WebContent/WEB-INF/weblogic-web.xml index 3e0192a..3d4f45b 100644 --- a/WebContent/WEB-INF/weblogic-web.xml +++ b/WebContent/WEB-INF/weblogic-web.xml @@ -34,7 +34,17 @@ contextConfigLocation /WEB-INF/applicationContext.xml - + + + + default + weblogic.servlet.FileServlet + + + default + /static/* + + authserver @@ -60,17 +70,17 @@ - - - - - - - - - - - + + + RestApiDynamicInAdapter + com.eactive.eai.adapter.http.dynamic.RestApiAdapterMain + 2 + + + RestApiDynamicInAdapter + /API/* + /api/* +