javascript 如何在组件上不使用http上下文的情况下用另一种方式实现会话超时?

x759pob2  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(70)

我在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上下文?

sshcrbum

sshcrbum1#

您可以使用JavaScript和Blazor的C#代码的组合在Blazor服务器端应用程序中创建会话超时。不使用HttpContext,您可以将最后一个活动时间戳存储在本地存储中,并使用JavaScript检查会话超时。
在项目中删除HttpContextAccessor和ISession的使用:

function checkSessionTimeout(currentUrl) {
var sessionTimeout = 20 * 60 * 1000; // 20 minutes in milliseconds
var lastActivity = new Date(Date.parse(localStorage.getItem("LastActivity"))); // get the last activity time from the client-side local storage

if (new Date() - lastActivity > sessionTimeout) {
    localStorage.clear(); // clear the local storage
    window.location.href = "/Login/Login"; // redirect to login page
} else {
    setTimeout(function () { checkSessionTimeout(currentUrl); }, 1000); // check again in 1 second
}
}

checkSessionTimeout(window.location.href);

在您的页面。razor,删除@inject ISession会话;行并修改OnInitialized方法:

@inject IJSRuntime JS;

protected override async Task OnInitializedAsync()
{
    DateTime now = DateTime.Now;
    string nowString = now.ToString("yyyy-MM-ddTHH:mm:ss");
    await JS.InvokeVoidAsync("localStorage.setItem", "LastActivity", 
nowString);
}

从页面中删除OnAfterRenderAsync方法。razor,因为JavaScript代码现在将处理会话超时检查。
在您的_Host中。cshtml文件,包括修改后的JavaScript文件:

<script src="~/js/checkSessionTimeout.js"></script>

在你的启动。cs,删除与HttpContextAccessor和ISession相关的行。您的ConfigureServices方法应如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
    services.AddRazorPages();
    services.AddServerSideBlazor();
}

相关问题