超时后重新初始化会话并将其设置为只读

时间:2018-06-21 08:07:19

标签: asp.net asp.net-mvc session

会话的使用类似于缓存:它填充了数据库中的某些数据,只是为了提供更快的访问权限。它可以持续20分钟。身份验证cookie全天有效,因为用户不希望每次会话期满时都登录。如有必要,我只是恢复会话。

// global.asax
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    if (Session == null)
        return;

    // if special key is not present then session is expired
    if (Session["filled"] == null)
    {
        if (User.Identity.IsAuthenticated)
        {
            FillSession(Session, User.Identity.Name);
        }
    }
}

现在,我想将会话设为只读,以实现更好的性能(Storing Anything in ASP.NET Session Causes 500ms Delays),并确保没有人可以使用它来存储超时后无法完全恢复的数据。可以使用httpContext.SetSessionStatebehavior(...)方法来完成。因此,会话在大多数情况下应该是只读的,但是如果会话过期并且创建了新会话,则该会话应该是可写的,以便能够用数据填充它。重点是

  • 我需要检测会话已过期。我知道所有方法都需要访问会话变量。
  • 会话可用后,就无法更改其状态,直到下一个请求。

我当前的解决方法是(尚未测试):

  • 使用httpContext.SetSessionStatebehavior(...)将会话设为只读,除非未找到表明会话必须可写的特殊cookie 。否则,请执行FillSession()并删除Cookie。
  • 如果会话已过期并且我需要恢复它(但它已经是只读的),请设置特殊cookie 并重定向到相同的URL(返回302:已临时移动)。但我担心此解决方案可能存在的弊端。

您知道更好的解决方法吗?还是我的方法完全错误?

0 个答案:

没有答案