セッション管理プログラム
セッション管理プログラムは、セッションを作成、検証および解除するプロセスで、MCIから呼び出すユーザーカスタマイズプログラムを意味する。 各サイトでは、様々なセッション方式を使用しているため、サイトではBXIが提供するAPIに従って、セッション管理プログラムを開発する必要がある。 MCIは、セッション管理プログラムを使用して、セッション情報を作成・検証し、セッションデータを抽出する。
セッション管理プログラムは、UserSessionProcess
インターフェースに定義されたAPIを実装する必要がある。
APIに関する説明は、下記のとおりである。
セッション作成API
ログイン取引時、SystemUserLoginRouter
から呼び出されるAPIが、ヘッダーとボディ電文を利用して、ユーザーセッション情報を作成し応答する。
public UserSessionInfo createSessionInfo(Map<String, Object> header, Map<String, Object> body, String remoteIp);
入力
- header : コアシステムでログインサービス応答として受け取った標準電文ヘッダーデータ
- body : コアシステムでログインサービス応答として受け取った個別部データ
- remoteIp : 端末IP Address
出力
- UserSessionInfo : セッション情報
例は下記のとおりである。
@Override
public UserSessionInfo createSessionInfo(Map<String, Object> header, Map<String, Object> body, String remoteIp) {
if (ObjectUtil.isEmpty(header) || ObjectUtil.isEmpty(body)) {
return null;
}
UserSessionInfo sessionInfo = new UserSessionInfo();
// ヘッダー、または個別部から必要データを抽出してセッション情報を作成する。
sessionInfo.setTerminalNo((String) body.get("terminalNo"));
sessionInfo.setStaffId((String) header.get("usrId"));
sessionInfo.setTerminalIp((String) header.get("ipAddr"));
sessionInfo.setExpiredTime(getSessionExpireTime());
sessionInfo.setSessionId(makeSessionId(sessionInfo));
if (sessionInfo.getTerminalIp() == null) {
sessionInfo.setTerminalIp(remoteIp);
}
// 責任者承認情報を照会すると、処理のためにログインした端末が責任者の端末であるかを区分する。
sessionInfo.setAuditTerminal(false);
String auditYn = (String) body.get("auditYn");
if (auditYn != null && "Y".equalsIgnoreCase(auditYn)) {
sessionInfo.setAuditTerminal(true);
}
// ログインした端末がBIDメッセージを受け取れる端末なのかを区分する。
sessionInfo.setBidSend(true);
String bidYn = (String) body.get("bidYn");
if (bidYn != null && "N".equalsIgnoreCase(bidYn)) {
sessionInfo.setBidSend(false);
}
// 電文にsession id保存
body.put("sessionId", sessionInfo.getSessionId());
return sessionInfo;
}
/**
* セッションIDを作成する。
*
*
* @param sessionlnfo
* @return
*/
private String makeSessionId(UserSessionInfo sessionlnfo) {
StringBuilder sb = new StringBuilder(64);
sb.append(sessionlnfo.getStaffId());
if (sessionlnfo.getMacAddr() != null) {
sb.append(sessionlnfo.getMacAddr());
}
sb.append(DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE));
int value = ThreadLocalRandom.current().nextInt(1000000);
sb.append(String.format("%06d", value));
LOG.debug("sessionId: {}", sb.toString());
return sb.toString().trim();
}
ユーザーID照会API
MCIは、ユーザーIDを利用してログイン済みかどうかを検証する。 サイトごとにユーザーIDに対するフィールドが異なるため、ヘッダーとボディ電文を利用して、ユーザーIDを返すようにAPIを実装する必要がある。
public String getStaffId(Map<String, Object> header, Map<String, Object> body);
入力
- header : コアシステムでログインサービス応答として受け取った標準電文ヘッダーデータ
- body : コアシステムでログインサービス応答として受け取った個別部データ
出力
- String : ユーザーID
例は下記のとおりである。
@Override
public String getStaffId(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(header)) {
return null;
}
return (String) header.get("usrId");
}
セッションID照会API
MCIは、セッションIDを識別子としてIMDGでセッションを管理する。その後、セッション検証において、IMDG照会時にセッションIDを使用する。 サイトごとにセッションIDに対するフィールドが異なるため、ヘッダーとボディー電文を利用してセッションIDをを返るようにAPIを実装する必要がある。
public String getSessionId(Map<String, Object> header, Map<String, Object> body);
入力
- header : コアシステムでログインサービス応答として受け取った標準電文ヘッダーデータ
- body : コアシステムでログインサービス応答として受け取った個別部データ
出力
- String : セッションID
例は下記のとおりである。
@Override
public String getSessionId(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
return (String) body.get("sessionId");
}
リモートIP照会API
MCIは、セッション検証でセッション情報のリモートIPと現在要求している取引のリモートIPを検証する。 サイトごとにリモートIPに対するフィールドが異なるため、ヘッダーとボディ電文を利用してリモートIPをを返るようにAPIを実装する必要がある。
public String getRemoteIp(Map<String, Object> header, Map<String, Object> body);
入力
- header : コアシステムでログインサービス応答として受け取った標準電文ヘッダーデータ
- body : コアシステムでログインサービス応答として受け取った個別部データ
出力
- String : リモートIP
例は下記のとおりである。
@Override
public String getRemoteIp(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(header)) {
return null;
}
return (String) header.get("ipAddr");
}
BID取引API
BID取引とは、コアシステムで特定端末やユーザー、または部署に属しているユーザーに、メッセージを送る際に使用する逆方向取引を意味する。
BID取引はSystemBidSendRouter
で行い、ユーザーが実装したAPIを利用して、メッセージを送信するユーザー、URL、およびメッセージを取得してウェブソケットに送信する。
このため、ユーザーは下記のようなAPIを実装する必要がある。
/**
* BIDを送信するIPリストを返す。
*/
public List<String> getBidIpList(Map<String, Object> header, Map<String, Object> body);
/**
* BIDを送信するWebSocket URLを返す。
*/
public String getBidUrl(Map<String, Object> header, Map<String, Object> body);
/**
* BIDメッセージを返す。
*/
public String getBidMessage(Map<String, Object> header, Map<String, Object> body);
- 入力
- header : コアシステムでログインサービス応答として受け取った標準電文ヘッダーデータ
- body : コアシステムでログインサービス応答として受け取った個別部データ
例は下記のとおりである。
@Override
public List<String> getBidIpList(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
String bidType = (String) body.get("bidType");
String bidValue = (String) body.get("bidValue");
LOG.debug("bidType: {}, bidValue: {}", bidType, bidValue);
if ("1".equals(bidType)) {
return UserSessionHelper.searchSessionByStaffId(bidValue);
} else if ("2".equals(bidType)) {
return UserSessionHelper.searchSessionByTerminalId(bidValue);
} else if ("3".equals(bidType)) {
return UserSessionHelper.searchSessionByDeptId(bidValue);
} else {
return new ArrayList<>();
}
}
@Override
public String getBidUrl(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
// BID URL
return "/bid";
}
@Override
public String getBidMessage(Map<String, Object> header, Map<String, Object> body) {
if (ObjectUtil.isEmpty(body)) {
return null;
}
return (String) body.get("bidMessage");
}
BXI MCIは、BIDメッセージを送信するためにウェブソケットを使用する。
しかし、サイト別に送信方式は様々であり、ウェブソケットを使用しない場合は、SystemBidSendRouter
の処理プログラムをカスタマイズして処理する。
タイムアウト時間照会API
MCIは、セッションタイムアウト時間を基本2時間に設定する。 セッションタイムアウト時間を変更したい場合は、下記のAPIをオーバーライディングして再定義する。
public default long getSessionExpireTime() {
return 7_200_000L;
}
- 出力
- long : タイムアウト時間