0

ASP.NET MVC 4 アプリケーションがあり、セッション タイムアウトを処理するためにセッション タイムアウト フィルター ハンドラーでセッション タイムアウトをトラップしています。また、ajax リクエストのセッション タイムアウトも処理したいと考えています。この質問で見つけたコードを最初に実装しましたhere 。

これは、最初はオートコンプリートやその他の ajax 呼び出しでうまくいきましたが、唯一の問題は、モーダル ポップアップへの ajax 呼び出しです!

そのため、セッション タイムアウト ハンドラを次のように変更しました。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.HttpContext.Session != null)
    {
        if (filterContext.HttpContext.Session.IsNewSession)
        {
            var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
            var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];

            if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.Clear();
                    filterContext.HttpContext.Response.StatusCode = 500;

つまり、ステータス コードを 500 に設定します (Windows 認証と偽装を使用しているため、401 は機能しませんでした。ステータスを 401 に変更すると、パスワードとユーザー名のセキュリティ ポップアップが表示されます)。

そして、これを .ajaxSetup または .ajaxError のいずれかにトラップし、両方を試しました...そしてセッションタイムアウトアクションにリダイレクトして(必要に応じて)、セッションタイムアウトでビューを表示します。

$(document).ajaxError(function (xhr, props) {
    if (props.status === 500) {
        ////session redirect goes here 
        var pathArray = window.location.pathname.split('/');
        var segment_1 = pathArray[1];
        var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
        window.location = newURL;
    }
});

問題はリダイレクトの前にあり、ajax ポップアップはまだ短時間開いています。だから、見栄えがよくありません。どうすればそれがまったく開かず、スムーズにリダイレクトされるのを防ぐことができますか?

これが私のjQueryダイアログコードです:

$(document).ready(function () {
    $(".openDialog").live("click", function (e) {
        e.preventDefault();
        $("<div></div>")
            .addClass("dialog")
            .attr("id", $(this)
            .attr("data-dialog-id"))
            .appendTo("body")
            .dialog({
                title: $(this).attr("data-dialog-title"),
                close: function () { $(this).remove() },
                width: 600,
                modal: true,
                height: 'auto',
                show: 'fade',
                hide: 'fade',
                resizable: 'false'
            })
        .load(this.href);

    });

    $(".close").live("click", function (e) {
        e.preventDefault();
        $(this).closest(".dialog").dialog("close");
    });
});

どんな助けでも大歓迎です、私はこれでほとんどそこにいると思います。

4

2 に答える 2

2

他の誰かが同じ問題を抱えている場合、これが私がやったことです...私はセッションハンドラーを使い続けましたが、500を上げると明らかに間違っており、いくつかの望ましくない副作用がありました:

からのコード

                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.Clear();
                    filterContext.HttpContext.Response.StatusCode = 403;

                }
                else ...usual code goes here ....

そして、次のように ajax エラーをトラップします。

$(document).ajaxError(function (xhr, props) {
    if (props.status == 403 ) {
        ////session redirect goes here 
        var pathArray = window.location.pathname.split('/');
        var segment_1 = pathArray[1];
        var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
        window.location = newURL;
    }
});

もちろん、私のポップアップは、リダイレクトする前にごく短時間ロードしようとしますが、ユーザーは気にしないようです。

于 2013-08-22T15:22:39.713 に答える
0

オーバーライドpublic override void OnActionExecuting(ActionExecutingContext filterContext)を削除して使用します (global.asax 内):

    protected void Application_EndRequest(object sender, EventArgs args)
    {

        HttpContextWrapper context = new HttpContextWrapper(Context);
        if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
            context.Response.RedirectLocation = string.Empty;
        //MiniProfiler.Stop();
    }

そしてあなたのJavaScriptで:

$.ajaxSetup({ //jQuery.ajaxSetup({
    statusCode: {
        302: function () {
            __userLoginEvent = true;
        }
    }
});

$(document).ajaxStop(function () {
    if (__userLoginEvent) {
        //your redirection here

        __userLoginEvent = false;
    }
})

私が使用ajaxStopするのは、複数の ajax 呼び出しの場合、1 つのリダイレクトが必要なためです。それは私にとって完璧に機能します。

于 2013-08-16T12:58:54.640 に答える