1

環境:

イントラネット

クライアント: 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が私を助けてくれることを望んでいます。私は本当に近くにいると感じていますが、単に見落としているか、何かを理解していません. どんな助けでも大歓迎です。

4

0 に答える 0