JQuery Ajax post在Safari中丢失Cookie
我正在维护一个经典的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页面时的用户名会话丢失,但访问时,工作正常直接页面。
忘记上面的回答,在我原来的职位Ajax代码是好的,这个代码是由一个jQuery的对话框,无论出于何种原因是造成问题包围了!
var r=confirm("Are you sure you want to delete this?");
if (r) {
// do the above ajax call here
}
在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);
},
});
感谢您的详细答案,但是最终结果只是将会话与ajax调用一起传递?首先我想停止ajax调用来终止会话! – 2013-03-04 14:50:43
嗯,是的,endresult是,你正在传递会话ID,但有很多情况下没有其他可能(例如iframe),因为你没有指定周围的html看起来像什么,我假设这将是敲死人的答案;) – 2013-03-04 18:41:20
不错!我会用if(confirm(“foo”)){}来减少变量的数量 – 2013-03-08 18:45:47