我正在维护一个经典的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会话丢失,但直接访问页面时工作正常。
答案 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);
},
});
答案 1 :(得分:0)
忘掉上面的答案,我原来的帖子中的ajax代码很好,这段代码被jQuery对话框所包围,无论出于什么原因导致了这个问题!
var r=confirm("Are you sure you want to delete this?");
if (r) {
// do the above ajax call here
}