调用 Abandon() 后 ASP.net MVC 5 会话未清除

Posted

技术标签:

【中文标题】调用 Abandon() 后 ASP.net MVC 5 会话未清除【英文标题】:ASP.net MVC 5 Session is not clearing after calling Abandon() 【发布时间】:2017-11-02 20:41:57 【问题描述】:

这里是 MVC 菜鸟。

我目前有这段代码在通过 AJAX 加载页面时触发我的 HomeController

namespace ETTData.Controllers

  public class HomeController : Controller
  
    [HttpPost]
    public ContentResult clearSessions()
    
        var currentSession = System.Web.HttpContext.Current.Session;

        System.Diagnostics.Debug.WriteLine("BEFORE: " + currentSession.Timeout);

        currentSession.Abandon();
        //currentSession.RemoveAll();
        //currentSession.Clear();

        System.Diagnostics.Debug.WriteLine("AFTER : " + currentSession.Timeout);

        return new ContentResult  Content = "OK", ContentType = "text/plain" ;
    
  

debug.WriteLine的输出是:

之前:35

之后:35

如您所见,它在 BEFORE 上有 35,但在 AFTER 时也有 35它不应该等于任何东西,因为我在调用该输出之前使用了 currentSession.Abandon();

我正在通过 Global.asax.cs 文件设置会话超时:

namespace ETTData

    public class MvcApplication : System.Web.HttpApplication
    
        protected void Session_Start(Object sender, EventArgs e)
        
            HttpContext.Current.Session.Timeout = 35;
        
    

这么说 - 我不知道为什么它不清除会话......

【问题讨论】:

【参考方案1】:

是的,这是一个很好的方法,很久以前我也使用了 WebForms。

问题是,您的会话绑定到会话 cookie。 cookie 在请求和响应标头中传输,这意味着通过 HTTP 协议。 HTTP 协议是无状态的,因此在发送响应之前它不能删除 cookie。

当您调用 session.Abandon 时,会话数据将在客户端丢弃 cookie 的同时被丢弃。这意味着框架将会话数据标记为“发送响应后清除”,即在 response.end 之后。在 response.end(将在 ContentResult.ExecuteResult 之后调用),框架将清除会话。随后它将调用 Session_End 事件。

Session.Clear 会立即删除项目,但不会删除会话 cookie - 因此它也不会结束会话,也不会调用 Session_End 事件 - 这是因为它不会使会话 cookie 过期。

将其视为异步函数。 您调用了放弃,但尚未执行。 正如其他人告诉您的那样,如果您需要立即清除会话,请在 session.abandon 之后调用 session.clear。

但是,如果您在致电session.abandon 后开始另一个会话,您将遇到一把非常锋利的刀。

基本上,您永远不应该使用会话。 如果您想访问“会话”数据而不绕道进入数据库,您应该将信息存储在加密和非对称签名的 cookie 中,如果您愿意,您可以将其绑定到会话生命周期,但您不这样做不得不。谷歌JWT 了解更多信息。我会将此类数据绑定到您的 auth-cookie 中。这样,就不需要 >1 个 cookie。 ASP.NET 中 20 分钟的默认超时是一件非常糟糕的事情。在您的身份验证完成之前,您的会话数据不应过期。

另外,请注意您在会话中写入的内容。 如果你只是在那里存储用户信息,那很好。 但是如果你在那里存储状态信息,你会遇到问题,因为我可以一次打开你网站的多个标签,然后来自 tab2 的状态将覆盖 tab1 的状态。每个有一个会话,而不是每个标签一个。

【讨论】:

【参考方案2】:

查看this question 寻找答案。

简而言之:Session.Abandon 会破坏会话,但不会清除它的值。这发生在请求结束时。 Session.Clear 清除会话中的所有内容,但不会破坏它。

【讨论】:

以上是关于调用 Abandon() 后 ASP.net MVC 5 会话未清除的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除

Session.Abandon 不会自动重定向到 asp.net 中的 loginurl

asp.net 中切换页面时 为啥session会丢失

Session.Abandon 调用后 SessionID 仍然相同

使用asp.net mv在ado.net中选择带有where子句的查询

如何在asp.net中真正注销