環境:
イントラネット
クライアント: IE8
サーバー: JBOSS 4.2.3
AJAX 技術: DWR 2.x
シンプルなスクリプト タグを使用して、イントラネット アプリケーションに簡単に追加できるモジュール式の JavaScript を作成する必要があります。このスクリプトの目的は、セッションがタイムアウトするまでの残り時間を示すユーザー フレンドリーなプロンプトを使用して、共通のセッション タイムアウト アーキテクチャを作成することです。これはすべて (単純な setTimeout 呼び出しを使用して) 簡単ですが、サーバーにヒットする DWR によって開始された AJAX 要求を考慮する必要があるため、実際のセッションが延長されます。これをモジュール式の非侵入型設計にする必要があるため、各イントラネット アプリケーション内のコードを変更することはできません。そのため、多くの検索を行った後、イベントをキャプチャするためにページからの AJAX 呼び出しをインターセプトできるスクリプトを見つけました - javascript で ActiveXObject を拡張する
window.XMLHttpRequest のテストで false が返されるように、ブラウザー環境がロックされているように見えます。そのため、スクリプトの ActiveX バージョンに関連する部分を使用します。DWR は msxml2.xmlhttp.6.0 バージョンのコントロールを使用しているようです。
私の問題は、この行 (ステップ 3.4 と 3.5 の間) で発生しているようです...
batch.req.setRequestHeader("Content-Type", "text/plain"); //@TODO
DWR で生成された engine.js ファイル内のコードのこのセクション内...
try {
alert("Step 1 - engine.js - before open; batch.req = " + batch.req);
batch.req.open(batch.httpMethod, request.url, batch.async);
alert("Step 3 - engine.js - after open; batch.req = " + batch.req);
try {
for (prop in batch.headers) {
var value = batch.headers[prop];
if (typeof value == "string") {
batch.req.setRequestHeader(prop, value);
}
}
if (!batch.headers["Content-Type"]) {
alert("Step 3.4 - engine.js - inside of 'if (!batch.headers[\"Content-Type\"])'; before setRequestHeader call; batch.req = " + batch.req);
batch.req.setRequestHeader("Content-Type", "text/plain"); //@TODO
alert("Step 3.5 - engine.js - inside of 'if (!batch.headers[\"Content-Type\"])'; after setRequestHeader call; batch.req = " + batch.req);
}
}
catch (ex) {
dwr.engine._handleWarning(batch, ex);
}
alert("Step 4 - engine.js - before send; batch.req = " + batch.req);
batch.req.send(request.body);
alert("Step 5 - engine.js - after send; batch.req = " + batch.req);
「batch.req」は本質的に「new ActiveXObject('msxml2.xmlhttp.6.0');」であることに注意してください。
これは、「ActiveXObject の拡張」スクリプトによって傍受されるものです...
Step 2.1 - CommonSessionTimeout.js
intercepted open (POST , /tbcalltracking/dwr/call/plaincall/JDataHelper.getSystemTime.dwr , true , undefined , undefined)
そのままでは、ActiveXObject を拡張するスクリプトが配置されているため、DWR 呼び出しは「'req' is null or not an object」というメッセージで失敗します。サーバーのログを表示しても、 DWR アクティビティは表示されません。「setRequestHeader」への呼び出しが ActiveX XMLHttpRequest オブジェクトを無効にしているかのように???
この行をコメントアウトすると、サーバー ログで DWR アクティビティを確認でき、ログで戻り値を確認することもできますが、戻り値がコールバック関数 (およびその後のページ) に返されることはないようです。私の推測では、Content-Type ヘッダーが設定されていないためです。
そこで、上記のリンクで参照されているスクリプトを変更して、そこにリクエスト ヘッダーを設定しようとしました。このような呼び出しを「インターセプト」するため、リクエスト ヘッダーをそこで定義する必要があると考えました。私の最初の試みは、「open」の呼び出しの後にこの行を単純に追加することでした(returnキーワードを削除しました)...
this._ax.setRequestHeader("Content-Type", "text/plain");
これは効果がありませんでした。私の2番目の試みは、これをスクリプトに追加することでした...
o._setRequestHeader = function () {
alert("Step 2.0 - setting request header...");
return this._ax.setRequestHeader("Content-Type", "text/plain");
};
これも効果がありませんでした。
繰り返しになりますが、DWR で生成された「engine.js」ファイルを変更することはできません。他の開発者が後で来て、基になる Java クラスを変更した場合 (メソッドの追加/削除またはメソッド シグネチャの変更)、ファイルを再構築する必要があるためです。DWR のリターン ターゲットのほとんどは、フォーム上の単純なフィールドであり、あまり凝ったものではありません (ここではそうです。DWR は、Web サービスを呼び出す Java クラス/メソッドへの要求を開始します。Web サービスは、解析されるいくつかの値を返します。適切なフィールドに配置されます)。
私はここで機知に富んでおり、SOが私を助けてくれることを望んでいます。私は本当に近くにいると感じていますが、単に見落としているか、何かを理解していません. どんな助けでも大歓迎です。