11

これが重複していることはわかっていますが、信頼できるソリューションを取得できませんでした(asp.net Webの場合)。

セッションの有効期限が切れた場合にログイン ページにリダイレクトしたいだけです。私は次のことを試しました:

1.jqueryステータスコードを使用

    $.ajax({
     type: "POST",
     url: "stream.asmx/SomeMethod",
     contentType: "application/json; charset=utf-8",
     dataType: "json",
     success: function (msg) {
        //success msg
     },
     error: function (request, status, error) {
        if (status = 403) {
            location.href = 'login.aspx';
        }
     }
    });

問題:これは、他のエラーに対しても同じステータス コード (403) を返します。これは、セッション タイムアウトにのみ期待されます。

2. セッションの有効期限が切れているかどうかにかかわらず、json メッセージを送信する

コードビハインド:

    if (!object.Equals(HttpContext.Current.Session["User"], null))
    {
        Id = int.Parse(HttpContext.Current.Session["User"].ToString());
    }
    else
    {
        result = from row in dtscrab.AsEnumerable()
                 select new
                 {
                     redirectUrl = "login.aspx",
                     isRedirect = true
                 };
    }

$.ajax の成功時:

    success: function (msg) {
        if (msg.d[0].isRedirect) {
            window.location.href = msg.d[0].redirectUrl;
        }
        else {
            //load containt
        }
     }

問題:セッションが期限切れになった場合、どういうわけか ajax 成功行が呼び出されません (正しい json が返されます)。また、ページに多数の ajax リクエストがある場合(グローバルに処理する必要がある場合)、これも適切な方法ではありません。

しかし、私はこの投稿を見ましたが、これは本当に良い解決策ですが、mvc を使用するためのものですAuthorizeAttribute: handling-session-timeout-in-ajax-calls

では、asp.net Web API で AuthorizeAttribute を使用して mvc で使用されているのと同じ概念を使用できますか? そうでない場合、直面している問題 (上記の 2 つのいずれか) をトラブルシューティングするにはどうすればよいですか?

4

5 に答える 5

3

403ステータスコードにより、jQueryはfailureメソッドを呼び出します。2回目の試行から同じコードを残しますが、リダイレクトハンドラーを成功メソッドではなく失敗メソッドに移動します。成功方法では、通常どおりに扱います。

于 2013-01-04T14:34:16.317 に答える
3

結局フォローすることになりました。

public class IsAuthorizedAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var sessions = filterContext.HttpContext.Session;
                if (sessions["User"] != null)
                {
                    return;
                }
                else
                {
                    filterContext.Result = new JsonResult
                    {
                        Data = new
                        {
                            status = "401"
                        },
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet
                    };

                    //xhr status code 401 to redirect
                    filterContext.HttpContext.Response.StatusCode = 401;

                    return;
                }
            }

            var session = filterContext.HttpContext.Session;
            if (session["User"] != null)
                return;

            //Redirect to login page.
            var redirectTarget = new RouteValueDictionary { { "action", "LogOn" }, { "controller", "Account" } };
            filterContext.Result = new RedirectToRouteResult(redirectTarget);
        }
    }

クライアントサイドの扱い

<script type="text/javascript">
    $(document).ajaxComplete(
       function (event, xhr, settings) {
           if (xhr.status == 401) {
               window.location.href = "/Account/LogOn";
           }
    });
</script>
于 2014-07-28T14:51:06.930 に答える
3

問題:

セッションがタイムアウトしたときに ajax 呼び出しが行われている間に、Razor MVC アプリケーションで例外をスローするという同じ問題がありました。

この問題を解決する方法は、リクエストが認証されているかどうかに関係なくブール変数を返す単純な軽量アクション メソッド (RAZOR MVC) を使用して各 ajax リクエストを監視することです。以下のコードを見つけてください..

レイアウト/マスターページ/スクリプトファイル:

<script>
var AuthenticationUrl = '/Home/GetRequestAuthentication';
var RedirectUrl = '/Account/Logon';

function SetAuthenticationURL(url) {
AuthenticationUrl = url;
}

function RedirectToLoginPage() {
window.location = RedirectUrl; 
}

 $(document).ajaxStart(function () {
 $.ajax({
    url: AuthenticationUrl,
    type: "GET",
    success: function (result) {
        if (result == false) {
            alert("Your Session has expired.Please wait while redirecting you to login page.");
            setTimeout('RedirectToLoginPage()', 1000);
        }
    },
    error: function (data) { debugger; }
});

}))

次に、ホームコントローラー/サーバー側で、リクエストを検証してブール変数を返すメソッドが必要です..

    public ActionResult GetAuthentication ( )
    {
        return Json(Request.IsAuthenticated, JsonRequestBehavior.AllowGet);
    }

これにより、各 ajax リクエストが検証され、いずれかの ajax リクエストのセッションが期限切れになった場合、ユーザーにメッセージで警告し、ユーザーをログイン ページにリダイレクトします。

また、標準の Alert to Alert を使用しないことをお勧めします。いくつかのツール ヒントの種類の書式設定された div アラートを使用します。標準の JS アラートでは、ユーザーがリダイレクトの前に [OK] をクリックする必要がある場合があります。

それが役に立てば幸い.. :)

ありがとう、リヤズ

于 2013-06-20T10:53:29.980 に答える
1

セッションタイムアウトの期限切れ警告を設定できます ....

<script type="text/javascript"> 

//get a hold of the timers
var iddleTimeoutWarning = null;
var iddleTimeout = null;

//this function will automatically be called by ASP.NET AJAX when page is loaded and partial postbacks complete
function pageLoad() { 

    //clear out any old timers from previous postbacks
    if (iddleTimeoutWarning != null)
        clearTimeout(iddleTimeoutWarning);
    if (iddleTimeout != null)
        clearTimeout(iddleTimeout);
    //read time from web.config
    var millisecTimeOutWarning = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeoutWarning"]) * 60 * 1000 %>;
    var millisecTimeOut = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeout"]) * 60 * 1000 %>; 

    //set a timeout to display warning if user has been inactive
    iddleTimeoutWarning = setTimeout("DisplayIddleWarning()", millisecTimeOutWarning);
    iddleTimeout = setTimeout("TimeoutPage()", millisecTimeOut);
} 

function DisplayIddleWarning() {
    alert("Your session is about to expire due to inactivity.");
} 

function TimeoutPage() {
    //refresh page for this sample, we could redirect to another page that has code to clear out session variables
    location.reload();
} 

于 2012-12-31T11:30:14.880 に答える
0

4xx は HTTP エラー ステータス コードであり、jquery が onFailure コールバックを実行する原因となります。

また、ペイロードを処理する場合は、リダイレクトに 3xx を使用しないように注意してください。私の経験では、Internet Explorer は、3xx ステータス コードが返されたときに (ペイロードを確認せずに) リダイレクトするだけです。

私は、403を投げて状況を処理すると言います。クライアントにとって、403 はリソース アクセスが禁止されていることを意味します。複数の理由が考えられますが、それは問題ないと思います。

于 2013-01-11T01:23:09.990 に答える