使用 Reactjs + Redux + Saga ASP.NET Core 设置。当核心会话过期 asp.net 它需要通知用户。但问题是通过发送 GET 请求来检查会话状态,我们延长了会话,这意味着除非浏览器中的选项卡关闭,否则会话永远不会结束(然后不会发送 GET 请求(。这是会话设置Startup.cs
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(60 * 60);
options.Cookie.HttpOnly = true;
});
然后我们每 5 分钟从客户端发送一次请求以获取身份:
function* checkSessionIsValid() {
try {
const response = yield call(axios.get, 'api/Customer/FetchIdentity');
if (!response.data) {
return yield put({
type: types.SESSION_EXPIRED,
});
yield delay(300000);
return yield put({ type: types.CHECK_SESSION_IS_VALID });
}
return;
} catch (error) {
return;
}
}
后端端点(_contextIHttpContextAccessor
(:
[HttpGet("FetchIdentity")]
public LoginInfo GetIdentity()
{
if (SessionExtension.GetString(_context.Session, "_emailLogin") != null)
{
return new LoginInfo()
{
LoggedInWith = "email",
LoggedIn = true,
Identity = ""
};
}
return null;
}
所以我们从SessionExtension
那里获得会话信息。但是可能有某种方法可以在不连接到后端的情况下获得它?
你问的东西是不可能的,坦率地说,当你理解会话的工作原理时,这是没有意义的。会话仅存在于请求的上下文中。HTTP 是一种无状态协议。会话本质上是通过让服务器和客户端传递"会话 ID"来伪造状态。当服务器想要与客户端建立"会话"时,它通常通过Set-Cookie
响应标头向客户端发出会话 ID。然后,客户端将在每个后续请求上传回此 id,通常通过Cookie
请求标头。当服务器收到此 id 时,它会从存储中查找相应的会话,然后可以访问以前处于游戏状态的任何状态。
关键是,如果没有先的请求,服务器就不知道或不关心特定会话发生了什么。过期部分发生在服务器下次尝试查找会话时。如果时间过长(会话过期时间已过(,则会销毁上一个会话并创建一个新会话。它不会主动监视会话以在特定时间执行任何操作。而且,由于如您所指出的,会话正在滑动,因此过期时间范围内的每个请求都会重置该时间范围。因此,只要客户端正在使用会话,会话就永远不会过期。
无论何时多长,了解会话状态的唯一方法是使用会话 ID 发出请求,以提示服务器尝试恢复该会话。如果要跟踪会话过期客户端,最好的办法是根据已知超时设置计时器客户端。然后,您需要重置所述时间,并发出每个进一步的请求。
var sessionTimeout = setTimeout(doSomething, 20 * 60 * 1000); // 20 minutes
然后,在 AJAX 回调中:
clearTimeout(sessionTimeout);
sessionTimeout = setTimeout(doSomething, 20 * 60 * 1000);
也许可以使用 SessionState 属性。
[SessionState(SessionStateBehavior.Disabled)]
https://msdn.microsoft.com/en-US/library/system.web.mvc.sessionstateattribute.aspx?cs-save-lang=1&cs-lang=cpp
编辑:意识到您正在使用.NET Core,不确定SessionState属性或类似内容是否存在于今天。