付録A.13 バックエンドシステム連携

バックエンドシステムと連携するポートレットの開発について説明します。ポートレットとバックエンドシステムを連携させる場合,エンドユーザのリクエストのたびにバックエンドにログインして問い合わせる方法(ステートレス)と,バックエンドとのコネクションを保持したまま問い合わせる方法(ステートフル)があります。

<この項の構成>
(1) ステートレス接続
(2) ステートフル接続

(1) ステートレス接続

ステートレスな接続の場合,あらかじめ取得しておいたLoginContextからログイン情報を取得し,バックエンドへの問い合わせ,およびログアウトをします。ステートレスな連携の場合,状態を保持しないのでポータルのログアウトやポータルのユーザセッションタイムアウトは意識する必要はありません。

次にサンプルコードを示します。

<%@ page import="javax.security.auth.login.LoginContext" %>
<%@ page import="javax.security.auth.Subject" %>
<%@ page import="javax.security.auth.Principal" %>
<%@ page import="com.cosminexus.admin.auth.callback.WebPasswordHandler" %>
<%@ page import="com.cosminexus.admin.auth.UserAttributes" %>

<%
 /*
 * ユーザID,属性取得処理
 */
 ユーザID,属性取得処理;  

 //  バックエンドシステム問い合わせ
 バックエンドシステムログイン;
 問い合わせ処理;
 バックエンドシステムログアウト;
%>

<!--バックエンドシステムの結果を出力 -->
ポートレットコンテンツ出力

(2) ステートフル接続

ステートフルな接続の場合,バックエンドとのコネクションを保持しておく必要があります。ポータルのユーザセッションに対応するHttpSessionを利用すると,コネクションを保持できます。ログアウトは,HttpSessionBindingListenerを利用します。HttpSessionBindingListenerを利用すると,ユーザがポータルをログアウトしたタイミングでバックエンドシステムのログアウト処理をします。

MyLoginContextクラスはログイン情報を保持するクラスで,HttpSessionBindingListenerインタフェースを実装しています。また,valueUnboundメソッドでバックエンドシステムのログアウト処理を記述します。valueUnboundメソッドは,MyLoginContextがHttpSessionから削除されるとき,つまり,ログアウトのタイミングで呼び出されます。

次にサンプルコードを示します。

import javax.servlet.http.*;
import javax.security.auth.login.LoginContext;

class MyLoginContext
   implements HttpSessionBindingListener, java.io.Serializable {
 public MyLoginContex(...) {
   ...
 }

 public void valueBound(HttpSessionBindingEvent event) { ... }

 /**
 * ログアウト処理をする。このメソッドはセッションが無効(ユーザログアウト時,
 * セッションタイムアウト時)に呼び出される。
 */
 public void valueUnbound(HttpSessionBindingEvent event) {
   HttpSession event.getSession();
   バックエンドシステムログアウト処理;
 }
}
 
<%@ page import="javax.security.auth.*" %>
 ...

<%
 if (ログイン必要) {
   LoginContext取得処理;  
   ユーザID,属性取得処理;  
   バックエンドシステムログイン;

   バックエンドシステムとの連携に必要な情報をMyLoginContextに設定;
   HttpSessionにMyLoginContextを格納;
 }
%>

<%
 HttpSessionからログイン情報取得;
 問い合わせ処理;
%>
<!--バックエンドシステムの結果を出力 -->
ポートレットコンテンツ出力