我在Web应用程序Blazor服务器端工作。我需要另一种方法来实现会话超时,而不是使用http上下文。
当使用HTTP上下文实现会话超时时,我会遇到更多问题
所以我需要另一种解决方案来解决这个问题,而不是使用HTTP上下文。
services.AddScoped<ISession>(_ => _.GetRequiredService<IHttpContextAccessor>().HttpContext.Session); line 67 that give me error
我在20分钟后应用会话超时
1 -在wwwroot/js文件上创建js,具有checkSessionTimeout功能
function checkSessionTimeout(currentUrl) {
var sessionTimeout = 20 * 60 * 1000; // 2 minutes in milliseconds
var lastActivity = new Date(Date.parse(sessionStorage.getItem("LastActivity"))); // get the last activity time from the client-side session
if (new Date() - lastActivity > sessionTimeout) {
/*console.log("reach 2 minutes")*/
sessionStorage.clear(); // clear the session storage
}
else
{
setTimeout(function () { checkSessionTimeout(currentUrl); }, 1000); // check again in 1 second
}
}
checkSessionTimeout(window.location.href);
第2页。剃刀
@inject ISession Session;
protected override void OnInitialized()
{
DateTime now = DateTime.Now;
string nowString = now.ToString("yyyy-MM-ddTHH:mm:ss");
JS.InvokeVoidAsync("sessionStorage.setItem", "LastActivity", now);
}
3 -组件加载后调用函数checkSessionTimeout
protected override async Task OnAfterRenderAsync(bool firstRender)
{
var lastActivity = Session.GetInt32("LastActivity");
if ( TimeSpan.FromTicks(DateTime.Now.Ticks - lastActivity.Value) < TimeSpan.FromMinutes(20))
{
navigationManager.NavigateTo("/Login/Login");
return;
}
}
4-on _host文件在正文的最后一行添加以下内容:
<script src="~/assets/js/checksessiontimeout.js"></script>
5-在启动类上(我在使用http上下文添加会话超时时出错)
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddHttpClient();
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20);
});
services.AddScoped<ISession>(_ => _.GetRequiredService<IHttpContextAccessor>().HttpContext.Session); line 67 that give me error
}
如何在组件上实现会话超时而不使用http上下文?
1条答案
按热度按时间sshcrbum1#
您可以使用JavaScript和Blazor的C#代码的组合在Blazor服务器端应用程序中创建会话超时。不使用HttpContext,您可以将最后一个活动时间戳存储在本地存储中,并使用JavaScript检查会话超时。
在项目中删除HttpContextAccessor和ISession的使用:
在您的页面。razor,删除@inject ISession会话;行并修改OnInitialized方法:
从页面中删除OnAfterRenderAsync方法。razor,因为JavaScript代码现在将处理会话超时检查。
在您的_Host中。cshtml文件,包括修改后的JavaScript文件:
在你的启动。cs,删除与HttpContextAccessor和ISession相关的行。您的ConfigureServices方法应如下所示: