0

我正在维护一个经典的 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 会话丢失,但在直接访问页面时可以正常工作。

4

2 回答 2

1

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

默认情况下,AJAX 调用不会重新发送 cookie 或 url 参数,因此在这两种情况下您都必须主动。

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

在 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 没有返回任何内容,这并不意味着用户没有登录。 //EDIT - 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

于 2013-03-04T11:45:49.177 回答
0

忘记上面的答案,我原始帖子中的 ajax 代码很好,这段代码被一个 jQuery 对话框包围,无论出于何种原因导致问题!

var r=confirm("Are you sure you want to delete this?");
if (r) {
// do the above ajax call here
}
于 2013-03-04T16:17:38.027 回答