2013-03-01 99 views
-1

我正在維護一個經典的asp網站,只要我像下面的代碼一樣進行JQuery/Ajax調用,我的ASP會話丟失了&我退出了該網站。JQuery Ajax post在Safari中丟失Cookie

$().ready(function() { 

$('#DeleteItem').click(function() { 

    $.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: '/delete.asp?PartyId=550', 
      success: function (response) { 
       if(response.type == 'delete') { 
        alert('delete went ok'); 
       } 
      }, 
      error: function (event, request, settings) { 
       // alert('RESP:' + response + ' REQ: ' + request + ' SETTINGS' + settings); 
      }, 
     }); 

    return false; 
}); 

});

「delete.asp」包含一個很基本的檢查,以確保登錄會話仍然有效

If Session("UserID") = "" Then Response.Redirect "/login/" 

訪問通過jQuery/AJAX頁面時的用戶名會話丟失,但訪問時,工作正常直接頁面。

回答

0

忘記上面的回答,在我原來的職位Ajax代碼是好的,這個代碼是由一個jQuery的對話框,無論出於何種原因是造成問題包圍了!

var r=confirm("Are you sure you want to delete this?"); 
if (r) { 
// do the above ajax call here 
} 
+0

不錯!我會用if(confirm(「foo」)){}來減少變量的數量 – 2013-03-08 18:45:47

1

在ASP.NET中跟蹤會話有兩種方式(或者就此而言,幾乎每個框架)。第一個選項是cookie,通常的回退選項是URL重寫。

AJAX調用不會在默認情況下重新發送cookie或url參數,因此在這兩種情況下您都必須採取主動措施。

處理的第一個選項(cookie被激活):(此代碼的源代碼是w3schools,爲什麼另起爐竈?)

function getCookie(c_name) 
{ 
var i,x,y,ARRcookies=document.cookie.split(";"); 
for (i=0;i<ARRcookies.length;i++) 
{ 
    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")); 
    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1); 
    x=x.replace(/^\s+|\s+$/g,""); 
    if (x==c_name) 
    { 
    return unescape(y); 
    } 
    } 
} 

這種方法:

JavaScript讀取餅乾就像做有另一個可能很重要的邊緣問題,session-id-cookie可以在ASP.NET中重命名。以編程方式檢索名稱是可能的,hava看看stackoverflow: get session cookie name,並且出於你爲什麼要做這樣的事情看看stackoverflow: Reason to rename ASP.NET Session Cookie Name的原因。

默認名稱(這可能會爲你工作)是:

ASP.NET_SessionId 

現在,如果getCookie方法不返回任何東西,這並不意味着用戶沒有登錄 //編輯。 - ASP.NET不使用參數...我如何錯過反向來源?

那麼,現在我們有了SessionID,我們要做的就是讓AJAX請求工作,將SessionID重寫到URL中。

var SessionID = getCookie('ASP.NET_SessionId'); 
var urlprefix = "./"; 
if(SessionID != undefined) 
    urlprefix = "./(S(" + SessionID + ")/"; 
$.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: urlprefix + 'delete.asp', 
      data: {"PartyId" : 550} 
      success: function (response) { 
       if(response.type == 'delete') { 
        alert('delete went ok'); 
       } 
      }, 
      error: function (event, request, settings) { 
       // alert('RESP:' + response + ' REQ: ' + request + ' SETTINGS' + settings); 
      }, 
     }); 

來源:http://msdn.microsoft.com/en-us/library/ms178581.aspx

+0

感謝您的詳細答案,但是最終結果只是將會話與ajax調用一起傳遞?首先我想停止ajax調用來終止會話! – 2013-03-04 14:50:43

+0

嗯,是的,endresult是,你正在傳遞會話ID,但有很多情況下沒有其他可能(例如iframe),因爲你沒有指定周圍的html看起來像什麼,我假設這將是敲死人的答案;) – 2013-03-04 18:41:20