kreta/KretaWeb/Controllers/Logic/SessionHandler.cs
2024-03-13 00:33:46 +01:00

75 lines
2.3 KiB
C#

using System;
using System.Runtime.Caching;
using Kreta.Core;
using Kreta.Framework;
using Kreta.Web.Security;
namespace Kreta.Web.Controllers.Logic
{
public class SessionHandler
{
private static readonly CacheItemPolicy DefaultCacheItemPolicy = new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(60) };
private static int sessionTimeOut = 0;
private static string GetCacheKey(string sessionId)
{
return $"{nameof(SessionHandler)}_{sessionId}";
}
public static int SessionTimeOut
{
get
{
if (sessionTimeOut < 1)
{
sessionTimeOut = (SDAServer.Instance.Configuration.SessionTimeout - 1) * 60; // A kérés és válasz alatt a mi számlálónk elcsúszik pár másodperccel és a valódi session hamarabb járna le.
if (sessionTimeOut < 45)
{
sessionTimeOut = 45;
}
}
return sessionTimeOut;
}
}
public static void UpdateSessionTime()
{
string sessionId = ClaimData.SessionId;
if (string.IsNullOrWhiteSpace(sessionId))
{
throw new Exception("Invalid Session key");
}
Cache.Set(GetCacheKey(sessionId), DateTime.Now, DefaultCacheItemPolicy);
}
public static int GetRemainingTime()
{
string sessionId = ClaimData.SessionId;
if (string.IsNullOrWhiteSpace(sessionId))
{
throw new Exception("Invalid Session key");
}
DateTime lastCallTime = Cache.AddOrGetExisting(GetCacheKey(sessionId), DateTime.Now, DefaultCacheItemPolicy);
TimeSpan spendTime = DateTime.Now - lastCallTime;
int remainingTime = SessionTimeOut - (spendTime.Minutes * 60 + spendTime.Seconds);
PingKretaServerSession(sessionId);
return remainingTime;
}
public static void DropSession(string sessionId)
{
Cache.Remove(GetCacheKey(sessionId));
}
private static void PingKretaServerSession(string sessionId)
{
SDAServer.Instance.SessionManager.PingSession(sessionId);
}
}
}