如果会话在单页应用程序上过期,则重定向用户返回登录
本文关键字:重定向 用户 登录 返回 过期 程序上 会话 单页 应用 应用程序 如果 | 更新日期: 2023-09-27 18:30:09
我有一个高度基于ajax的web应用程序。我只有一个2个视图,即登录和主视图本身,其余的都是PartialViews,将使用ajax请求进行调用。
如果我将会话检查器放在部分视图中(通过ActionFilters),它将返回登录视图,并在ajax成功后显示,这不是我想要的结果,因为我希望主页本身重定向回登录屏幕。
我想到的一个解决方案是使用javascript超时,它将在给定一组时间间隔的情况下检查会话/身份验证是否仍然存在,但我不知道这种做法是否好。
有人能建议我做什么吗?
我有两个视图,分别是login
和mainframe
,然后是大约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);
}
}
也请参考这个从操作筛选器属性重定向