C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Java webシステム間連携について


(過去ログ 34 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■17245 / inTopicNo.1)  Java webシステム間連携について
  
□投稿者/ ま (15回)-(2008/04/20(Sun) 01:53:58)

分類:[.NET 全般] 

●システムA(以下A)
 某社が開発したかなり安定しているマルチセッション可能なフレームワーク上で動くWebシステム。
 見たことも触ったことも無いが、フレームワークの仕様書を見る限りということ。
 struts ベース。

●システムB(以下B)
 自社開発のかなり不安定なマルチセッション不可能なフレームワーク上で動くWebシステム。
 セッション無しでも画面を起動できる点が唯一のポイント。
 struts ベース、但し劣化してます。

●システムC(以下C)
 自社開発フレームワークで行こうとした矢先に、部長のなじみの会社に案件を吸い取られ、結果自社フレームワークを
 土台にしつつも大幅にデチューンしたがシステムBのフレームワークよりも安定しているある意味劣化版フレームワーク
 上で動く、マルチセッション不可能なWebシステム。
 見習ったフレームワーク自体が悪いのでこれも劣化 struts ベースです。

BとCを現在メンテしているのですが、今度Aが「同一ドメインでなければ出来ない連携」をするためこちらの環境に移行
されようとしています。但し厄介?なことにAの中身を触ることは一切出来ません。

同一ドメインで Aのセッション中のとある画面から showModalDialog 経由で、Bの新規画面を開き、BのDB情報を元に
ある計算を行った結果を、window.returnValue 経由で吸い取ろうという画面連携が実装される予定です。

同一ドメインならば、確かに showModalDialog だろうが、window.open だろうが、なんら関係なしにシステム間で連携でき
ますが、この連携を思いついた方々は静的HTML でのテスト確認しか行っていません。ですので、Aがまだこちらの環境に
移行されていないのですが、BとCを使って、CをAに見立ててBを呼び出す、ということを実際にやってみました。

Cのセッション中のとある画面にボタンを配置し、その画面から 静的HTML経由でBのサーブレットにポストする仕掛け
でやってみました。なぜ静的HTMLを間に挟む必要があるかというと、showModalDialog はフォームのターゲットにはでき
ないためです。

結果、Bをセッションを発行しないモードで起動するとBのJSPを ダイアログ内に表示し、そこで入力した値をCに戻す
ことに成功しました。


これでめでたしめでたしかとおもいきや、処理後、Cの画面で適当に画面遷移操作を行うとCのセッションがどうも壊れている
ように見える挙動が連発して発生し、画面が 404 になったり、1件も無いはずの検索結果が1件表示されたり、まことに怪しい
挙動が確認できました。モーダルダイアログを起動しない状態ではいじる前の普通に操作できる状態であったのでモーダルダイ
アログの起動後になんらかの情報が壊れているのが原因と推測しています。

今時、showModalDialog で画面連携も無いですが、これと同じ境遇に会われた方、居ましたらどんな些細なことでも良いので
その時の対処方法などあればお知らせ願います。

通常、こういうシステム連携というのはありえるのでしょうか?在り得る場合、双方のシステム間でどのようにしてセッションを
共有したりするのでしょうか?セッション・セッションって煩いですが、もしかしてセッションなんぞ関係無いとかそういう落ち
ですか?

もしかして、window.open ならそんなこと有り得ないのでしょうか?showModalDialog は window.open の子画面とはちょっと趣
が異なるのではないか?と愚考しています。

試したことは、
Cのセッション中に、Bをセッション新規で開始 =>結果はNG。どこをいじってもエラー画面しか出てこない。
Cのセッション中に、Bをセッション継続で開始 =>元々のセッションが無いのだから継続しようが無いのでこれもNG。
Cのセッション中に、Bをセッション無しで開始 =>上記の通り。

テスト構成は、
●Bに新規画面のサンプル画面をJSPで作成、サーブレットに初期化処理(静的HTMLからのポストパラメータを取得処理する)追加
●Cのとある画面に showModalDialog を呼び出すJavaScriptを追加、Cのパス配下に、BのサーブレットにPOSTするための静的HTML を
新規作成して追加

showModalDialog の第二パラメータに渡す情報は、
C画面のFORM 要素全てを cloneNode(true) で作成し、コピーを配列にセットして渡しています。
ダイアログ中のフォームにはその配列のノード種別に関係なく、HIDDEN 要素を作ってそれをフォームに追加し、そのフォームを
onload でBのサーブレットへサブミットしています。

cloneNode() でコピると一時的にIDやNAMEが重複することになるのですが、もしかしてこれが悪さしている原因でしょうか?
でもコピったからといって、Cのフォームにそのコピーが存在する訳では無いし、ダイアログ閉じたタイミングですべてのノードは
削除していますし・・・・この確認(cloneNode 以外での実装)はまだ行っていませんのでなんとも言えません。



以上




引用返信 編集キー/
■17246 / inTopicNo.2)  Re[1]: Java webシステム間連携について
□投稿者/ ま (16回)-(2008/04/20(Sun) 02:04:18)
No17245 (ま さん) に返信
分類が間違っていました。[.NET 全般] じゃなくて、コテコテの[ Java ] です。

現在の環境では、
システムA
 Java1.4.0.2 / WebSphere5.1 / Oracle9 / DB2 / Host(Cobol) / struts ベースカスタムチューニングしたフレームワーク。

システムB
Java1.4.0.2 / WebSphere5.1 / DB2 / Host(Cobol) / struts デグレード版

システムC
Java1.4.0.2 / WebSphere5.1 / Oracle9 / DB2 / Host(Cobol) / struts デグレード版もはや struts の痕跡無し。

引用返信 編集キー/
■17271 / inTopicNo.3)  Re[2]: Java webシステム間連携について
□投稿者/ 凪瀬 (28回)-(2008/04/21(Mon) 11:51:54)
凪瀬 さんの Web サイト
挙げられた情報からは「そんな動きするわけないだろ」というのが感想なのですが…。

まず、どういう操作をしたらどういう挙動をした、という正確な情報を集めてください。
この際に、実験手順としてはノイズが入ることを防ぐためにも単純化することが望ましい。

C -> C上の静的HTML -> B

という遷移の前後をはっきりさせてください。
また、Webシステムではブラウザなどのキャッシュにより、
実際の動きと別の動きに見えることがあります。
この点をよく注意して観測を行う必要があります。

404が出たりでなかったりというのはブラウザのキャッシュ系のトラブルでもなければ
通常発生しえない現象です。
サーバ側にアクセスログを仕込むなどして、実際にHTTP通信が行われているのか、
それとも通信は行われずブラウザのキャッシュが表示されているのか、確認してみましょう。
引用返信 編集キー/
■17272 / inTopicNo.4)  Re[3]: Java webシステム間連携について
□投稿者/ ま (17回)-(2008/04/21(Mon) 12:20:16)
No17271 (凪瀬 さん) に返信
> まず、どういう操作をしたらどういう挙動をした、という正確な情報を集めてください。
> この際に、実験手順としてはノイズが入ることを防ぐためにも単純化することが望ましい

了解です。

午前中だけ掲示板にレスを返せる環境にありますが、作業場所ではリードオンリーで歯がゆいです;

showModalDialog session

で検索したところ、なにやら不具合っぽいのがなんとなく分かりましたが、当方の現象に関連する
ものかどうかはちょっと怪しい、気もします。

http://support.microsoft.com/kb/196383/ja
これも既に直っている(軽減という言い方かな)?らしいのですが、これが開いた先じゃなくて
開いた元のセッションが切れてしまうことに繋がるのかは文面からは読み取れませんでした。


-----------
-----------
//呼び出し側 JSP の onload に仕込む。
<script>
window.attachEvent("onload", function (oButton, oForm, callbackFunc) {

	oButton.onclick = function() {
		var arr = [];
		for (var i=0;i < oForm.elements.length;i++) {
			arr.push( oForm.elements[i].cloneNode(true));
			//select-one , radio , check はもう少し複雑ですが、ここでは省略
		}
		var params = [];
		params.param = arr;
		params.method = "POST";
		params.action = "http://同じドメイン/servlet/xxx.class";
		
		var rets = showModalDialog("dummy.html",params, "dialogWidth:400px;dialogHeight:600px;");
		
		if (!callbackFunc) {
			alert(rets);
		}
		else {
			callbackFunc(rets);
		}
		return false;
	};
}(document.getElementById("xxxButton"), document.forms[0], function(rets) {
	var s = [];
	for (var a in rets) {
		s.push( a + "=>" + rets[a]);
	}
	alert(s.join("\n"));
}));
</script>

//dummy.html の<head> 直下に以下の<base>タグを記述
<base target="_self" />

//dummy.html の onload に仕込む
<script>
window.attachEvent("onload", function() {
	var arg = dialogArguments;
	var fom = document.createElement("form");
	fom.action = arg.action;
	fom.method = arg.method;
	for (var i=0;i < arg.param.length;i++) {
		var hid = document.createElement("input");
		hid.type = "hidden";
		hid.name = arg.param[i].name;
		hid.id = arg.param[i].id;
		hid.value = arg.param[i].value;
		//select-one , radio , check はもう少し複雑ですが、ここでは省略
		fom.appendChild(hid);
	}
	document.body.appendChild(fom);
	
	setTimeout(function() { document.forms[0].submit(); }, 100);
	
});
</script>


//dummy.html でポストしたコントロールサーブレットが返す JSP の中で
<script>
var retVal = [];
retVal.result = "CANCEL";
window.returnValue = retVal;

function closeDialog() {
	retVal.result = "OK";
	retVal.NAME = document.forms[0].NAME.value;
	retVal.ADDR = document.forms[0].ADDR.value;
	
	window.returnValue = retVal;

	self.window.close();

}
</script>





引用返信 編集キー/
■17273 / inTopicNo.5)  Re[4]: Java webシステム間連携について
□投稿者/ 凪瀬 (29回)-(2008/04/21(Mon) 12:31:06)
凪瀬 さんの Web サイト
> showModalDialog session
>
> で検索したところ、なにやら不具合っぽいのがなんとなく分かりましたが、当方の現象に関連する
> ものかどうかはちょっと怪しい、気もします。
>
> http://support.microsoft.com/kb/196383/ja
> これも既に直っている(軽減という言い方かな)?らしいのですが、これが開いた先じゃなくて
> 開いた元のセッションが切れてしまうことに繋がるのかは文面からは読み取れませんでした。

セッションが断絶するという現象に絞り込めているのですか?

セッションが切断するというのであれば、そもそもどのようなCookieが
流れているのかを確認するのがよいでしょう。
セッション維持の原理的な部分を確認することで、より直接的にそこで何が
起きているのかを把握することができます。

Cookieの送出を確認するには、HTTPのパケットを監視する必要があります。
ブラウザのプラグインタイプのものや、プロキシタイプのものがあります。
どのようなものでも構いませんが、HTTPヘッダを確認してセッション断絶の
ポイントをはっきりさせるとよいでしょう。
引用返信 編集キー/
■17316 / inTopicNo.6)  Re[5]: Java webシステム間連携について
□投稿者/ ま (18回)-(2008/04/22(Tue) 01:33:39)
2008/04/22(Tue) 01:37:32 編集(投稿者)

No17273 (凪瀬 さん) に返信
> セッションが断絶するという現象に絞り込めているのですか?

セッション断絶ではなくて、自らちょん切っていました。また例によってフレームワーク自身が・・・
セッションをの取得・保持方法を指定するオプションが4つあるのですが、
start => セッションを新規で作成する。但し、既存セッションがあればそれをちょん切る。
keep => セッションを継続する。セッションが存在しない場合は アプリケーションエラー。但し既存セッションがあれば切ってからアプリケーションエラー(start してないでいきなりの場合のみ)。
end => セッションを強制切断する。セッションが存在しない場合は アプリケーションエラー。
none => セッションが存在すればちょん切る。新たにセッションは生成しない。

という仕様になっており、none というのは、セッションに無頓着じゃなくて、在れば切断という仕掛け
が入っていました。

こういう4つのパターンバリエーションってのは良く見られるのでしょうか?
当方、あまりセッションには詳しくないのですが、none がどうも怪しい実装な気がしてならないです。
元もとよそのセッションで実行することは無い、という前提があったのだと思うのですが、stay なり hold なり
なスイッチがあってもよサゲに感じました。

例によって、フレームワークの根幹部分をいじらないと動かないことが分かったので、このお客さんの要望も先延ばし
になりそうです。


その他の指摘事項は今後のバグ調査の糧にします。
お付き合いありがとうございました。

余力があれば、通常?(何をもって通常とするかですが)のフレームワークってのは、セッションの指定方法の
バリエーションってどれくらい持っているもんなんです?なんて質問に答えてもらえると嬉しいです。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -