.net mvc & ajax формы - как обрабатывать сеанс истек - PullRequest
2 голосов
/ 27 июля 2010

У меня есть атрибут фильтра клиента для проверки истекшего сеанса в моем приложении .Net MVC, который отлично работает в стандартной HTML-форме. Однако, когда я применяю атрибут к действию, которое вызывается формой Ajax, и сеанс истекает, он перезагружает страницу входа (где атрибут фильтра перенаправляет контекст) в контейнер обновления ajax. Кто-нибудь знает способ заставить всю страницу перенаправить на страницу входа в систему, если сеанс истек, когда сделан вызов ajax, или кто-нибудь знает, как справиться с этой ситуацией немного более элегантно? Заранее спасибо.

public class SessionExpiredFilterAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;

            // check if session is supported
            if (ctx.Session != null)
            {

                // check if a new session id was generated
                if (ctx.Session.IsNewSession)
                {

                    // If it says it is a new session, but an existing cookie exists, then it must
                    // have timed out
                    string sessionCookie = ctx.Request.Headers["Cookie"];
                    if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                    {
                        //SessionHelper.AddPageMessage("message", "Your session has expired. Please login to continue");
                        ctx.Response.Redirect("~/Account/Logon");
                    }
                }
            }


            base.OnActionExecuting(filterContext);
        }
    }

1 Ответ

0 голосов
/ 01 декабря 2010

Я отправил оригинальный вопрос для этого, и я думаю, что наконец-то нашел решение для этого.Хотя это не так элегантно, как я надеялся, это работает (что больше, чем я нашел до сих пор).Решение лежит вокруг OnBegin AjaxOption и некоторого Jquery.Мой ActionLink (это также может быть Ajax.BeginForm, к которому он применяется) выглядит следующим образом:

<%= Ajax.ActionLink("Do Ajax Function", "AjaxAction", new { }, new AjaxOptions { OnBegin="check_session", OnSuccess = "ajaxSuccess", UpdateTargetId = "update_container"}, new { })%>  

У меня есть действие контроллера в контроллере учетной записи, которое проверяет сеанс, в моем случае я сохраняю пользователяобъект, поэтому я проверяю, является ли он нулевым, и возвращает «True» или «False» в качестве содержимого.OutputCache важен, иначе ваши результаты будут кэшированы.

[OutputCache(Duration=0, VaryByParam="None")]
        public ActionResult CheckAjaxSessionExpired()
        {

            bool _sessionExpired = false;
            if (Session["User"] == null)
            {
                _sessionExpired = true;
            }

            return Content(_sessionExpired.ToString());
        }

Последняя часть - это функция check_session, указанная в качестве обработчика OnBegin.Ajax-вызов Jquery выполняет действие проверки сеанса и проверяет ответ.Если ответ «True» (что означает, что сеанс истек), он устанавливает местоположение страницы обратно на домашнюю страницу (или в данном случае в Google).

function check_session(){

        var url = '<%= Url.Action("CheckAjaxSessionExpired", "Account") %>';


        //GET CHECK SESSION
        $.ajax({
            url: url,
            success: function(data) {

                //alert(data);

                if (data == "True"){
                    document.location = "http://www.google.com";
                }
            },
            error: function() { alert("there was a problem loading the ajax session check"); }
        });
    }

Есть несколько вещей, которые следует запомнитьесли использовать этот метод.Во-первых, это будет выполняться асинхронно.Если у вас есть код, чувствительный к данным, который вы вызываете, вам все равно нужно будет выполнить проверку на стороне сервера в сеансе.Этот код предназначен для простого перенаправления на страницу входа (или домашнюю страницу), если сеанс истек во время вызова ajax.Во-вторых, функция check_session должна быть подключена к событию OnBegin всех ваших вызовов Ajax.Если у кого-то есть какие-либо советы или предложения по улучшению этого метода, я хотел бы услышать их.Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...