JQuery Ajax在Safari中丢失了Cookie

时间:2013-03-01 11:45:37

标签: jquery ajax safari

我正在维护一个经典的asp站点,每当我像下面的代码那样进行JQuery / Ajax调用时,我的ASP会话就丢失了。我退出了网站。

$().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访问页面时,UserID会话丢失,但直接访问页面时工作正常。

2 个答案:

答案 0 :(得分:1)

在ASP.NET中跟踪会话有两种方式(或者就此而言,几乎每个框架都有)。第一个选项是cookie,通常的后备选项是URL重写。

AJAX调用默认情况下不重新发送cookie或url-parameters,所以在这两种情况下你都必须是主动的。

处理第一个选项(激活cookie):

在javascript中读取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);
    }
  }
}

此方法还有另一个有问题的边缘,这可能很重要,可以在ASP.NET中重命名session-id-cookie。以编程方式检索名称是可能的,请查看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

答案 1 :(得分:0)

忘掉上面的答案,我原来的帖子中的ajax代码很好,这段代码被jQuery对话框所包围,无论出于什么原因导致了这个问题!

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