0

以下のコードのような 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 (または、ほぼすべてのフレームワーク) 内でセッションを追跡する方法は 2 つあります。最初のオプションは Cookie で、通常のフォールバック オプションは URL 書き換えです。

デフォルトでは、AJAX 呼び出しは Cookie または URL パラメータを再送信しないため、どちらの場合も事前に対処する必要があります。

最初のオプションの処理 (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);
    }
  }
}

このメソッドには、重要な別の問題点があります。セッション ID Cookie は、ASP.NET で名前を変更できます。プログラムで名前を取得することは可能です.

デフォルトの名前 (おそらくこれで十分です) は次のとおりです。

ASP.NET_SessionId

さて、getCookie が何も返さなかったとしても、これはユーザーがログインしていないという意味ではありません。

これで、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 に答える