2012-03-23 140 views
5

我已經搜索jQuery論壇,stackoverflow,谷歌,bing,甚至雅虎w/o成功。 每10秒我想通過這個jQuery片段加載從logservlet servlet的文本數據:JQuery jsession cookie不發送到服務器

<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?是這樣,這應該是什麼樣子?順便說一句,當我從網頁瀏覽器調用相同的url時,JSESSIONID頭被髮送到服務器!

感謝, D.

回答

0

檢查您是否已經安裝在您的瀏覽器的廣告攔截。許多人將從XHR中刪除cookies。

2

確實我運行Adblock Plus,(感謝提示),但它與此無關。其實這件事有點棘手。我找到了兩個解決方案,但我沒有解釋發生了什麼。

解決方案#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; 
    } 

這工作得很好,並得到JSESSIONID在明年Ajax請求相應的送過來。

解決方案2: - 在servlet doGet()方法中添加「text/plain」MIME類型。 最初在我的測試中,我沒有設置任何內容類型。在我意識到JQuery默認期待XML響應之後,我改變了我的服務器doGet()方法來明確設置內容類型,如下所示:

resp.setContentType(「text/plain」);

現在,ajax調用也可以正常工作,實際上並不需要手動管理cookie。我沒有解釋爲什麼解決方案#2工作,但它是。

謝謝, D.