如果会话在单页应用程序上过期,则重定向用户返回登录

本文关键字:重定向 用户 登录 返回 过期 程序上 会话 单页 应用 应用程序 如果 | 更新日期: 2023-09-27 18:30:09

我有一个高度基于ajax的web应用程序。我只有一个2个视图,即登录和主视图本身,其余的都是PartialViews,将使用ajax请求进行调用。

如果我将会话检查器放在部分视图中(通过ActionFilters),它将返回登录视图,并在ajax成功后显示,这不是我想要的结果,因为我希望主页本身重定向回登录屏幕。

我想到的一个解决方案是使用javascript超时,它将在给定一组时间间隔的情况下检查会话/身份验证是否仍然存在,但我不知道这种做法是否好。

有人能建议我做什么吗?

我有两个视图,分别是loginmainframe,然后是大约30个PartialViews

如果会话在单页应用程序上过期,则重定向用户返回登录

我过去曾使用Javascript计时器轮询服务器,以测试会话是否仍处于活动状态。如果我收到403,则重定向到登录页面。

var AutoLogout = {}; 
AutoLogout.pollInterval = 60000; // Default is 1 minute.
// Force auto logout when session expires 
AutoLogout.start = function (heartBeatUrl, sessionExpiredUrl, interval) {
    if (interval) AutoLogout.pollInterval = interval; 
    var timer = $.timer(function() { 
        checkSession(heartBeatUrl, sessionExpiredUrl, timer); 
    }); 
    timer.set({ time: AutoLogout.pollInterval, autostart: true }); 
};
// Check the session serverside to see if we need to auto-logout 
// if the clientActivity flag is set then the session will be extended before checking. 
// if the session is still alive then set the next timer interval to be the time returned from the server. 
function checkSession(sessionUrl, sessionExpiredUrl, timer) {
    $.ajax(sessionUrl,
        { type: "post",
             contentType: "application/json",
             success: function (result) 
             { 
                 // update the timer poll interval based on return value.
                 try { 
                         var r = ko.toJS(result); 
                         timer.set({ 
                             time: r.TimeoutMilliseconds ? r.TimeoutMilliseconds : AutoLogout.pollInterval, autostart: true 
                         }); 
                 } 
                 catch(e) { } 
             }, 
             error: function(e) 
             {
                // do nothing 
             }, 
             statusCode: 
             { 
                403: function () 
                { 
                    window.location.href = sessionExpiredUrl; 
                },
                401: function () 
                { 
                    window.location.href = sessionExpiredUrl; 
                }
            }
        });
    }

然后,当页面加载时,使用应用程序所需的url调用AutoLogout.start。

注意:在本例中,我使用了Knockout JS来解析服务器请求返回的数据,但这取决于您。

我会尽力解决你的问题

我会建议把你的逻辑付诸行动过滤器

 public class AuthorizeActionFilterAttribute : ActionFilterAttribute
    {
      public override void OnActionExecuting(FilterExecutingContext filterContext)
      {
        HttpSessionStateBase session = filterContext.HttpContext.Session;
        Controller controller = filterContext.Controller as Controller;
        if (controller != null)
        {
          if (session != null && session ["authstatus"] == null)
          {
filterContext.Result =
       new RedirectToRouteResult(
           new RouteValueDictionary{{ "controller", "Login" },
                                          { "action", "Index" }
                                         });
          }
        }
        base.OnActionExecuting(filterContext);
      }
    }

也请参考这个从操作筛选器属性重定向