Merge branch 'jenkins_with_weblogic' of ssh://192.168.240.178:18081/eapim/elink-online-common into jenkins_with_weblogic

This commit is contained in:
yunjy-hp
2025-12-09 14:18:47 +09:00
13 changed files with 544 additions and 452 deletions
@@ -367,7 +367,9 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
case POST:
// assignPostBody(dataObject, contentType, vo.getEncode(), method);
//assignPostBody(dataContent, contentType, vo.getEncode(), method); // jwhong commnet
assignPostBody(dataContent, contentType, vo.getEncode(), method, vo.getAdapterName(), auth);
// KJBank API 추적정보를 Header에 제공. jwhong
String inboundToken= assignRequestKJHeaders(method, prop, tempProp );
assignPostBody(dataContent, contentType, vo.getEncode(), method, vo.getAdapterName(), auth, inboundToken);
break;
default:
break;
@@ -385,7 +387,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
assignRequestHeaders(method, httpHeader);
// KJBank API 추적정보를 Header에 제공. jwhong
assignRequestKJHeaders(method, prop, tempProp );
//assignRequestKJHeaders(method, prop, tempProp );
int status = -1;
@@ -799,26 +801,48 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
}
/*
* KJBank Target System으로 요청 보낼때 header에 clientId(업체정보), APIM거래추적자(UUID), 최초 요청시간 보낸다. jwhong
* KJBank Target System으로 요청 보낼때 header에 clientId(업체정보), APIM거래추적자(UUID), 최초 요청시간, guid 추가해서 보낸다. jwhong
*/
private void assignRequestKJHeaders(HttpUriRequestBase method, Properties prop, Properties tempProp) {
private String assignRequestKJHeaders(HttpUriRequestBase method, Properties prop, Properties tempProp){
//weblogic 에서는 tempProp.get 이 property로 return 해어 아래처럼 수정함. ClassCastException 발생함.
//Properties inboundHeaders = (Properties) tempProp.get(HttpAdapterServiceKey.INBOUND_HEADER);
Properties inboundHeaders = null;
String authorization ="";
try {
Object headerObj = tempProp.get(HttpAdapterServiceKey.INBOUND_HEADER);
if (headerObj instanceof Properties) { //tomcat
inboundHeaders = (Properties) headerObj;
} else if (headerObj instanceof String) { //weblogic
inboundHeaders = new Properties();
inboundHeaders.load(new StringReader((String) headerObj));
for ( String k : inboundHeaders.stringPropertyNames()) {
if(k.equalsIgnoreCase("authorization")) {
authorization = inboundHeaders.getProperty(k);
break;
}
} catch (IOException e) {
}
} else if (headerObj instanceof String) { //weblogic
String str = (String) headerObj;
str = str.substring(1, str.length() - 1);
// 2. key=value 쌍 분리
String[] entries = str.split(",");
// map에 담기
Map<String, String> map = new HashMap<>();
for (String entry : entries) {
String[] kv = entry.split("=", 2);
if (kv.length == 2) {
map.put(kv[0].trim(), kv[1].trim());
}
}
for (String k : map.keySet()) {
if (k.equalsIgnoreCase("authorization")) {
authorization = map.get(k);
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
String authorization = inboundHeaders.getProperty("authorization");
String jwtToken = "";
if (authorization != null && authorization.startsWith("Bearer ")) {
@@ -833,21 +857,19 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
String uuid = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID, "");
method.setHeader("traceId", uuid);
/*
Set<String> keys = tempProp.stringPropertyNames();
for (String key : keys) {
String value = tempProp.getProperty(key);
logger.debug(key + " = " + value);
}
*/
/* GUID */
String guid = tempProp.getProperty(TransactionContextKeys.GUID, "");
method.setHeader("guid", guid);
/* 최초요청시간 */
String receivedTimestamp = tempProp.getProperty(HttpAdapterServiceKey.INBOUND_REQUESTED_TIME, "");
method.setHeader("receivedTimestamp", receivedTimestamp);
return jwtToken;
}
@SuppressWarnings("deprecation")
private void assignPostBody(Object eaiBody, String contentType, String charset, HttpUriRequestBase method, String adapterName, String niceAuth) {
private void assignPostBody(Object eaiBody, String contentType, String charset, HttpUriRequestBase method, String adapterName, String niceAuth, String inboundToken) {
if (eaiBody == null) {
return;
}
@@ -868,7 +890,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
} else {
ContentType contentTypeObj = ContentType.create(contentType, charset);
String eaiBodyMessage = doOutboundPreFilter(eaiBody, adapterName, niceAuth); // jwhong
String eaiBodyMessage = doOutboundPreFilter(eaiBody, adapterName, niceAuth, inboundToken); // jwhong
StringEntity entity = new StringEntity(eaiBodyMessage, contentTypeObj);
// 요청 본문을 StringEntity 객체로 생성
//StringEntity entity = new StringEntity(eaiBody.toString(), contentTypeObj);
@@ -879,28 +901,33 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
}
// from here by jwhong
private String doOutboundPreFilter(Object eaiBody, String adapterName, String niceAuth) {
private String doOutboundPreFilter(Object eaiBody, String adapterName, String niceAuth, String inboundToken) {
Properties properties = AdapterPropManager.getInstance().getProperties(adapterName); // jwhong
String encryptAlgorithm = properties.getProperty("ENCRYPT_ALGORITHM",""); // jwhong
//String encryptBaseKeyType = properties.getProperty("ENCRYPT_BASE_TYPE");
String encryptBaseKeyType = properties.getProperty("ENCRYPT_BASE_TYPE");
String encryptClientId = properties.getProperty("ENCRYPT_CLIENT_ID");
String encryptAES256Iv = properties.getProperty("ENCRYPT_AES256_IV");
String encryptAES256Key = properties.getProperty("ENCRYPT_AES256_KEY");
String certPath = properties.getProperty("ENCRYPT_CERT_PATH");
// outbound encrypt 는 SecretKey 또는 NICE-auth 가 암호화 key로 사용된다.
// outbound 알림결과는 SecretKey, NICE-auth, Token을 사용한다.
// 참고로 inbound encrypt 에는 Token 또는 SecretKey 가 암호화 key로 사용된다.
// 여기에 NICE-auth 뭔지 파악하여 logic 추가해야 한다.
// 여기에 NICE-auth logic 추가.
String clientSecret = "";
if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) {
clientSecret = inboundToken;
} else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) {
OAuth2Manager manager = OAuth2Manager.getInstance();
ClientDetails clientDetail = manager.getClientDeatilsStore().get(encryptClientId);
String clientSecret = "";
if ( clientDetail != null ) { // not null 이라는 것은 APIM Oauth Server에 등록된 client ID 이다.
// 이건 KJBank로 Outbound 나가는 것
// 업체가 우리 OAuth 를 사용하는 경우
clientSecret = clientDetail.getClientSecret();
} else { // 그럼 업체로 Outbound 나가는것은, 업체에서 사용하는 secretkey를 사용한다.
} else { // 이경우는 우리 OAuth를 사용안하는 경우임, 업체에서 사용하는 secretkey를 사용한다.
clientSecret = encryptClientId;
}
}
// Nice-auth , token 값을 substring 해서 사용한다. 나이스 지키미는 adapter token에서 추출된 token을 사용한다.
if (useAdapterToken && "AES256-NICEON".equals(encryptAlgorithm)) {
@@ -910,6 +937,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
// 여기서 SECRETY인지 nice-auth 인지 check 하여 clientSecret 값을 정하는 logic 추가하여 넘겨야한다.
String responseMessage = doOutboundPreEncrypt(eaiBody, encryptAlgorithm, clientSecret, encryptAES256Iv, encryptAES256Key, certPath);
logger.debug("outbound pre encrypte value is :"+responseMessage);
return responseMessage;
}
@@ -924,6 +952,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
case "AES":
encryptedMessage = encrypt(eaiBody.toString()); // encrypt by jwhong
break;
case "AES128":
case "AES128-TOSS":
try {
String key = clientSecretKey.substring(22,38);
@@ -1089,6 +1118,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
case "AES":
decryptedMessage = decrypt(eaiBody); // encrypt by jwhong
break;
case "AES128":
case "AES128-TOSS":
try {
String key128 = clientSecretKey.substring(22,38);
@@ -1199,6 +1229,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
String jsonKey = "";
switch (Algorithm) {
case "AES128":
case "AES128-TOSS":
jsonKey = "preScreeningRequest";
break;
@@ -78,6 +78,8 @@ public interface HttpAdapterServiceKey {
static final String ENCRYPT_AES256_IV = "ENCRYPT_AES256_IV"; // jwhong
static final String ENCRYPT_AES256_KEY = "ENCRYPT_AES256_KEY"; // jwhong
static final String INBOUND_REQUESTED_TIME = "INBOUND_REQUESTED_TIME"; // jwhong
static final String GUID = "GUID"; // jwhong
static final String API_SERVICE_CODE = "API_SERVICE_CODE"; // jwhong
//응답 처리 용 표준 전문 오브젝트
static final String STANDARD_MESSAGE_OBJECT = "STANDARD_MESSAGE_OBJECT";
@@ -24,7 +24,9 @@ public class HttpDynamicInAdapterManager implements Lifecycle {
private static HttpDynamicInAdapterManager instance = new HttpDynamicInAdapterManager();
private ConcurrentHashMap<String, HttpDynamicInAdapterUri> adptUriMap = new ConcurrentHashMap<String, HttpDynamicInAdapterUri>();
//private ConcurrentHashMap<String, HttpDynamicInAdapterUri> adptUriMap = new ConcurrentHashMap<String, HttpDynamicInAdapterUri>();
public ConcurrentHashMap<String, HttpDynamicInAdapterUri> adptUriMap = new ConcurrentHashMap<String, HttpDynamicInAdapterUri>();
public static HttpDynamicInAdapterManager getInstance() {
return instance;
@@ -224,17 +224,20 @@ public class HttpClientAccessTokenServiceWithParam implements HttpClientAccessTo
logger.debug("contentType = [" + contentType + "]");
logger.debug("encode = [" + encode + "]");
OAuth2AccessTokenVO accessToken = new OAuth2AccessTokenVO();
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
if (response.getCode() != 200) {
System.out.println("OAuth token receive status fail value= "+ response.getCode());
throw new Exception("OAuth token receive status fail value= " + response.getCode());
}
System.out.println("OAuth token receive status SUCCESS value= "+ response.getCode());
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, encode);
logger.debug("oauthToken RECV = [" + responseString + "]");
if (StringUtils.isNotBlank(responseString)) {
OAuth2AccessTokenVO accessToken = new OAuth2AccessTokenVO();
//OAuth2AccessTokenVO accessToken = new OAuth2AccessTokenVO();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode responseJSON = objectMapper.readTree(responseString);
@@ -259,6 +262,10 @@ public class HttpClientAccessTokenServiceWithParam implements HttpClientAccessTo
} else {
throw new Exception("oauth token return null");
}
} catch (Exception e) {
e.printStackTrace();
logger.error("[HttpClientAccessTokenServiceWithParam] retrieve accessToken exception :" + e.getMessage());
return accessToken;
}
}
}
@@ -60,7 +60,6 @@ import com.ext.eai.common.stdmessage.STDMessageKeys;
// safeDB
import com.eactive.ext.kjb.safedb.KjbSafedbWrapper;
import com.eactive.ext.kjb.safedb.Utils;
// until here
@Service
@@ -2,11 +2,15 @@ package com.eactive.eai.common.logger;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
public class HttpAdapterExtraHeaderVo {
private String name;
private String value;
public HttpAdapterExtraHeaderVo() {
}
}
@@ -8,6 +8,7 @@ import java.util.List;
public class HttpAdapterExtraLogVo {
private String guid;
private int serviceProcessNumber;
private String prcsDate;
private String adapterGroupName;
private String adapterName;
private String url;
@@ -3,7 +3,7 @@ package com.eactive.eai.common.logger.async;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.server.EAIServerManager;
import com.eactive.eai.common.util.LogKeys;
import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraHeader;
//import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraHeader;
import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraLog;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@@ -66,7 +66,7 @@ public class HttpAdapterExtraLogH2Factory {
// 엔티티 클래스 추가
configuration.addAnnotatedClass(HttpAdapterExtraLog.class);
configuration.addAnnotatedClass(HttpAdapterExtraHeader.class);
// configuration.addAnnotatedClass(HttpAdapterExtraHeader.class);
return configuration.buildSessionFactory();
} catch (Throwable ex) {
@@ -1,22 +1,22 @@
package com.eactive.eai.common.logger.mapper;
import com.eactive.eai.common.logger.HttpAdapterExtraHeaderVo;
import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraHeader;
import com.eactive.eai.data.mapper.BaseMapperConfig;
import com.eactive.eai.data.mapper.GenericMapper;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(config = BaseMapperConfig.class)
public interface HttpAdapterExtraHeaderMapper extends GenericMapper<HttpAdapterExtraHeaderVo, HttpAdapterExtraHeader> {
@Override
@Mapping(source = "id.name", target = "name")
HttpAdapterExtraHeaderVo toVo(HttpAdapterExtraHeader entity);
@Override
@InheritInverseConfiguration
HttpAdapterExtraHeader toEntity(HttpAdapterExtraHeaderVo vo);
}
//package com.eactive.eai.common.logger.mapper;
//
//import com.eactive.eai.common.logger.HttpAdapterExtraHeaderVo;
//import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraHeader;
//import com.eactive.eai.data.mapper.BaseMapperConfig;
//import com.eactive.eai.data.mapper.GenericMapper;
//
//import org.mapstruct.InheritInverseConfiguration;
//import org.mapstruct.Mapper;
//import org.mapstruct.Mapping;
//
//@Mapper(config = BaseMapperConfig.class)
//public interface HttpAdapterExtraHeaderMapper extends GenericMapper<HttpAdapterExtraHeaderVo, HttpAdapterExtraHeader> {
//
// @Override
// @Mapping(source = "id.name", target = "name")
// HttpAdapterExtraHeaderVo toVo(HttpAdapterExtraHeader entity);
//
// @Override
// @InheritInverseConfiguration
// HttpAdapterExtraHeader toEntity(HttpAdapterExtraHeaderVo vo);
//}
@@ -1,42 +1,80 @@
package com.eactive.eai.common.logger.mapper;
import com.eactive.eai.common.logger.HttpAdapterExtraHeaderVo;
import com.eactive.eai.common.logger.HttpAdapterExtraLogVo;
import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraHeaderId;
import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraLog;
import com.eactive.eai.data.mapper.BaseMapperConfig;
import com.eactive.eai.data.mapper.GenericMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.mapstruct.*;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Optional;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
@Mapper(config = BaseMapperConfig.class, uses = HttpAdapterExtraHeaderMapper.class)
public interface HttpAdapterExtraLogMapper extends GenericMapper<HttpAdapterExtraLogVo, HttpAdapterExtraLog> {
@Slf4j
@Mapper(config = BaseMapperConfig.class)
public abstract class HttpAdapterExtraLogMapper implements GenericMapper<HttpAdapterExtraLogVo, HttpAdapterExtraLog> {
private final static ObjectMapper objectMapper = new ObjectMapper();
private static final DateTimeFormatter SDF_YYYYMMDD = DateTimeFormatter.ofPattern( "yyyyMMdd");
@Override
@Mapping(source = "id.guid", target = "guid")
@Mapping(source = "id.serviceProcessNumber", target = "serviceProcessNumber")
HttpAdapterExtraLogVo toVo(HttpAdapterExtraLog entity);
abstract public HttpAdapterExtraLogVo toVo(HttpAdapterExtraLog entity);
@Override
@InheritInverseConfiguration
HttpAdapterExtraLog toEntity(HttpAdapterExtraLogVo vo);
abstract public HttpAdapterExtraLog toEntity(HttpAdapterExtraLogVo vo);
@AfterMapping
default void setHeaderIdAndWeekday(@MappingTarget HttpAdapterExtraLog entity, HttpAdapterExtraLogVo vo) {
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek(); // 현재 요일
int dayOfWeekNumber = dayOfWeek.getValue() % 7 + 1; // 1 (일요일)부터 7 (토요일)까지
entity.getId().setWeekday(dayOfWeekNumber);
Optional.ofNullable(entity.getHeaderList())
.ifPresent(headers -> headers.forEach(header -> {
if (header.getId() == null) {
header.setId(new HttpAdapterExtraHeaderId());
public void voToEntity(@MappingTarget HttpAdapterExtraLog entity, HttpAdapterExtraLogVo vo) {
// 1. Set weekday for partition table
// DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek(); // 현재 요일
// int dayOfWeekNumber = dayOfWeek.getValue() % 7 + 1; // 1 (일요일)부터 7 (토요일)까지
// entity.getId().setWeekday(dayOfWeekNumber);
// String prcs_date = SDF_YYYYMMDD.format(ZonedDateTime.now());
String prcs_date = LocalDate.now().format(SDF_YYYYMMDD);
entity.getId().setPrcsDate(prcs_date);
// 2. Set Content
try {
String headerContent = objectMapper.writeValueAsString(vo.getHeaderList());
entity.setHeaderContent(headerContent);
} catch (JsonProcessingException e) {
log.warn("Http Header Json Parse 실패", e);
entity.setHeaderContent("[{ \"error\": \"parse error\"}]");
}
}
/**
* Entity → VO 변환 후 추가 처리
*/
@AfterMapping
protected void entityToVo(@MappingTarget HttpAdapterExtraLogVo vo, HttpAdapterExtraLog entity) {
String headerContent = entity.getHeaderContent();
if (headerContent == null || headerContent.isEmpty()) {
vo.setHeaderList(Collections.emptyList());
return;
}
try {
List<HttpAdapterExtraHeaderVo> headerList = objectMapper.readValue(
headerContent,
new TypeReference<List<HttpAdapterExtraHeaderVo>>() {}
);
vo.setHeaderList(headerList);
} catch (JsonProcessingException e) {
log.warn("Http Header 역직렬화 실패", e);
vo.setHeaderList(Collections.emptyList());
}
header.getId().setWeekday(dayOfWeekNumber);
header.getId().setGuid(vo.getGuid());
header.getId().setServiceProcessNumber(vo.getServiceProcessNumber());
}));
}
}
@@ -101,7 +101,7 @@ public class HttpAdapterExtraLogUtil {
public static List<HttpAdapterExtraHeaderVo> convertHeaderToListOfHttpAdapterExtraHeaderVo(Header[] headers) {
Set<String> seenNames = new HashSet<>();
return Arrays.stream(headers)
.filter(header -> seenNames.add(header.getName())) // 중복된 이름을 스킵
// .filter(header -> seenNames.add(header.getName())) // 중복된 이름을 스킵
.map(header -> new HttpAdapterExtraHeaderVo(header.getName(), header.getValue()))
.collect(Collectors.toList());
}
@@ -121,7 +121,11 @@ public class RequestProcessor extends RequestProcessorSupport {
String bidInterface = adptGrpVO.getBidInterface();
String testMasterYn = adptGrpVO.getTestMasterYn();
// UUID 생성 : UUID = "-" 없는 32자리 UUID(광주은행 요청)
// UUID 생성 : UUID에서 - 없는 32자리
String uuid = "";
uuid = UUIDGenerator.getUUID().toString().replaceAll("-", "");
// UUID 생성 : UUID = server구분4자리 + UUID
/*
String uuid = "";
uuid = UUIDGenerator.getUUID().toString().replaceAll("-", "");
@@ -135,6 +139,7 @@ public class RequestProcessor extends RequestProcessorSupport {
// if (logger.isError()) logger.error(rspErrorMsg);
// throw new RequestProcessorException(rspErrorMsg);
// }
*/
ProcessVO vo = new ProcessVO();
vo.setAdapterGroupName(adapterGroupName);
@@ -337,7 +342,9 @@ public class RequestProcessor extends RequestProcessorSupport {
}
// 3. EAIMessage Object 생성
String eaiSvcCd = mapper.getEaiSvcCode(standardMessage);
//String eaiSvcCd = mapper.getEaiSvcCode(standardMessage); // commnet by jwhong
String eaiSvcCd = prop.getProperty("API_SERVICE_CODE");
System.out.println("***** eaiSvcCd is"+ eaiSvcCd);
String guid = mapper.getGuid(standardMessage);
String guidSeq = mapper.getGuidSeq(standardMessage);
String returnType = mapper.getSendRecvDivision(standardMessage); // S|R
@@ -440,6 +440,7 @@ public class RESTProcess extends HTTPProcess {
PropertiesUtil.copyPropertyIfPresent(this.callProp, this.tempProp, HttpAdapterServiceKey.INBOUND_REMOTE_ADDR);
PropertiesUtil.copyPropertyIfPresent(this.callProp, this.tempProp, HttpAdapterServiceKey.INBOUND_SCHEME);
PropertiesUtil.copyPropertyIfPresent(this.callProp, this.tempProp, HttpAdapterServiceKey.INBOUND_REQUESTED_TIME); // jwhong
PropertiesUtil.copyPropertyIfPresent(this.callProp, this.tempProp, HttpAdapterServiceKey.GUID); // jwhong
String svcName = getServiceId(this.reqEaiMsg);
if (svcName == null) {