5

jquery フォーラム、stackoverflow、google、bing、さらには yahoo を検索しましたが、成功しませんでした。10 秒ごとに、次の JQuery スニペットを介して logservlet サーブレットからテキスト データをロードしようとしています。

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
    <script type="text/javascript">
            var autorefresh = setInterval(function () {
                $.ajax({
                    url : "logservlet?devkey=chat",
                    success : function(data) {
                        $("#log_ta").append(data);
                    }
                });
                }, 10000);
    </script>

問題は、サーバー側で、セッション属性を追跡しようとする有効なセッションが表示されないことです。この問題は、JQuery からの http 要求のヘッダーに "Cookie JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxxxxx" がないことに関連しているようです。サーバーから応答ヘッダーを取得していますが、JSESSIONID は要求ごとに常に変化します。

    Server  Apache-Coyote/1.1
    Set-Cookie  JSESSIONID=9EEAFA2A933E7742D8FEDADD5345B76D; Path=/CumulusServer
    Content-Length  0
    Date    Fri, 23 Mar 2012 13:02:08 GMT

ただし、JQuery はそれ以降は使用しません。リクエスト ヘッダーは次のとおりです。

    Host    192.168.1.11:8080
    User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
    Accept  */*
    Accept-Language en-us,en;q=0.5
    Accept-Encoding gzip, deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Connection  keep-alive
    X-Requested-With    XMLHttpRequest
    Referer http://192.168.1.11:8080//CumulusServer/

ここでの問題は何ですか?「$.ajax」呼び出しはセッションに対応していませんか? それとも、各 ajax リクエストで JSESSIONID を手動でハードコーディングするための配管コードを見逃していますか? そうですか、これはどのように見えるべきですか?ところで、Web ブラウザーから同じ URL を呼び出すと、JSESSIONID ヘッダーがサーバーに送信されます。

ありがとう。

4

2 に答える 2

2

実際、私は Adblock Plus を実行していますが (ヒントをありがとう)、これとは何の関係もありません。実際には少しトリッキーです。2 つの解決策を見つけましたが、何が起こっているのか説明がありません。

解決策 #1: - ページの読み込み時に JSESSIONID を手動で保存する:

    var Session = {
       id : '${pageContext.session.id}',
       user : '${pageContext.request.remoteUser}'
    };

    $(window).load(function () {
        setCookie('JSESSIONID',Session.id);
    });

    function setCookie(name,value,expires,path,domain,secure) {
        var cookieString = name + "=" +escape(value) +
           ( (expires) ? ";expires=" + expires.toGMTString() : "") +
           ( (path) ? ";path=" + path : "") +
           ( (domain) ? ";domain=" + domain : "") +
           ( (secure) ? ";secure" : "");
        document.cookie = cookieString;
    }

これは正常に機能し、それに応じて次の ajax リクエストで JSESSIONID が送信されます。

解決策 #2: - サーブレットの doGet() メソッドに「text/plain」MIME タイプを追加します。最初のテストでは、コンテンツ タイプをまったく設定していません。JQuery がデフォルトで XML 応答を予期していることに気付いた後、サーバーの doGet() メソッドを変更して、次のようにコンテンツ タイプを明示的に設定しました。

resp.setContentType("テキスト/プレーン");

現在、ajax 呼び出しも正常に機能し、手動の Cookie 管理は実際には必要ありません。解決策 2 が機能する理由は説明できませんが、機能します。

ありがとう。

于 2012-03-27T01:39:49.643 に答える
0

ブラウザに広告ブロッカーがインストールされているかどうかを確認します。多くの場合、XHR から Cookie を取り除きます。

于 2012-03-26T22:27:53.593 に答える