【问题标题】:.net mvc & ajax forms - how to handle session expired.net mvc & ajax 表单 - 如何处理会话过期
【发布时间】:2011-03-21 17:14:11
【问题描述】:

我有一个客户过滤器属性来检查我的 .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);
        }
    }

【问题讨论】:

  • 我自己也在寻找答案。

标签: .net ajax model-view-controller session


【解决方案1】:

我为此发布了原始问题,我想我终于找到了解决方案。虽然它不像我希望的那样优雅,但它确实有效(这比我迄今为止发现的要多)。解决方案在于 OnBegin AjaxOption 和一些 Jquery。我的 ActionLink(它也可能是应用到的 Ajax.BeginForm)看起来像这样

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

我的帐户控制器中有一个控制器操作来检查会话,在我的情况下,我正在存储用户对象,所以我检查它是否为空,并返回“真”或“假”作为内容。 OutputCache 很重要,否则您的结果将被缓存。

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

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

            return Content(_sessionExpired.ToString());
        }

最后一部分是指定为 OnBegin 处理程序的 check_session 函数。 Jquery ajax 调用命中会话检查操作并检查响应。如果响应为“真”(意味着会话已过期),则将页面的位置设置回主页(在这种情况下为 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 函数需要连接到所有Ajax 调用的OnBegin 事件中。 如果有人对改进此方法有任何提示或建议,我很想听听。我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 2019-08-16
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2016-12-23
    相关资源
    最近更新 更多