2013-03-01 73 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