如何终止会话或会话 ID (ASP.NET/C#)

Posted

技术标签:

【中文标题】如何终止会话或会话 ID (ASP.NET/C#)【英文标题】:How to Kill A Session or Session ID (ASP.NET/C#) 【发布时间】:2011-07-16 20:39:35 【问题描述】:

当用户单击注销按钮时,如何销毁会话 (Session["Name"])?

我正在查看 MSDN 上的 ASP.NET API 参考,它似乎没有太多信息。似乎相当有限。但我找不到 ASP.NET 类等的任何其他页面。

我试过了:

Session.Abandon();Session.Contents.Remove("Name"); 他们都不工作。 (我在 Google 搜索的论坛中找到了这些)

【问题讨论】:

“两者都不起作用”是什么意思 嗯...当我输出 session["Name"] 的内容时,它仍然输出名称,但它不应该因为它应该被清除或杀死。它不会让我退出。所以,这就是我所说的“它们都不起作用”的意思 尝试添加重定向回登录页面,检查那里的 Session["Name"]。 可能是this link 可能会对您有所帮助。 Abaondon 方法可以工作,您只需从 html 脚本中获取 postbackurl 并在 Session.Abandon() 之后添加重定向。 【参考方案1】:

Abandon 方法应该可以工作 (MSDN):

Session.Abandon();

如果您想从会话中删除特定项目,请使用 (MSDN):

Session.Remove("YourItem");

编辑:如果您只想清除一个值,您可以这样做:

Session["YourItem"] = null;

如果要清除所有键,请执行以下操作:

Session.Clear();

如果这些都不适合你,那就是有问题了。我会检查您在哪里分配值,并在您清除值后验证它没有被重新分配。

简单检查:

Session["YourKey"] = "Test";  // creates the key
Session.Remove("YourKey");    // removes the key
bool gone = (Session["YourKey"] == null);   // tests that the remove worked

【讨论】:

谢谢,@Kelsey;我刚刚更新了我的问题以显示我已经尝试过的内容。 Abaondon 方法不起作用:S @Lucifer 您是要从当前会话中终止 Session,还是要从应用程序级别执行此操作并定位并终止特定会话? 嗯,从当前会话开始,? @Lucifer 我怀疑发生了其他事情。我已经编辑了我的答案,包括一个小检查和一些其他选项。 @Lucifer 你期待什么结果?在Remove 之后,该值将是null。你想要更多的事情发生吗?【参考方案2】:

指示客户端浏览器清除会话 id cookie 值也是一个好主意。

Session.Clear();
Session.Abandon();
Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-10);

【讨论】:

这真的有必要吗? Response.Cookies["ASP.NET_SessionId"].Value = string.empty ?还是只用 Session.Abandon() 就足够了?【参考方案3】:

Session.Abandon()

这会将会话标记为已放弃,但此时会话实际上不会被放弃,请求必须首先完成。

【讨论】:

【参考方案4】:

根据我的测试:

Session.Abandon(); // Does nothing
Session.Clear();   // Removes the data contained in the session

Example:
001: Session["test"] = "test";
002: Session.Abandon();
003: Print(Session["test"]); // Outputs: "test"

Session.Abandon 仅将会话对象中的布尔标志设置为 true。调用的网络服务器可能会对此做出反应,但 ASP 不会立即采取行动。 (我自己使用 .net-Reflector 进行了检查)

事实上,您可以继续使用旧会话,只需单击浏览器的后退按钮一次,即可继续正常浏览整个网站。

所以,总结一下:使用 Session.Clear() 并避免沮丧。

备注:我已经在 ASP.net 开发服务器上测试过这种行为。实际的 IIS 可能会有不同的行为。

【讨论】:

【参考方案5】:

Session.Abandon() 这会破坏数据。

请注意,这不一定会真正从用户那里删除会话令牌,并且稍后可能会拾取相同的会话令牌并创建为具有相同 ID 的新会话,因为它被认为是公平的游戏使用。

【讨论】:

谢谢@Chris,我试过了,它仍然输出会话的内容["Name"] 并且不会退出。【参考方案6】:

你像这样杀死一个会话:

Session.Abandon()

但是,如果您只想清空会话,请使用:

Session.Clear()

【讨论】:

如果您只是想删除“名称”,您可以使用Session.Remove("Name"); 或使用Session["Name"] = null; 清除它 这些都不起作用。我试过 Session.Abandon(); Session.Contents.Remove("名称"); Session.Contents.RemoveAll();会话.清除(); Session["Name"] = null (这是我最初所做的)-它们都不起作用。【参考方案7】:
Session.Abandon()

是你应该使用的。事情在幕后 asp.net 会破坏会话,但会立即在下一页请求上为用户提供一个全新的会话。因此,如果您正在检查会话是否在调用放弃后立即消失,它看起来好像没有工作。

【讨论】:

检查 MSDN 文档上的备注部分以获取 Session.Abandon -> msdn.microsoft.com/en-us/library/ms524310.aspx 谢谢@AlanB - 那么,如果会话不会被删除,如何在单击“退出”按钮后立即退出“帐户”? 我想这在一定程度上取决于您正在执行的代码,但基本操作是如果您在代码中执行 session.abandon() 调用的页面上有“注销”按钮然后重定向到您的主页。主页的加载应该有一个新会话,因此不再“登录”。他们将有一个新会话,但与旧会话相关的所有数据都消失了。【参考方案8】:
Session["YourItem"] = "";

在 .net razor 网页中表现出色。

【讨论】:

虽然此代码示例可能会回答这个问题,但最好在您的回答中包含一些基本解释。就目前而言,这个答案对未来的读者几乎没有价值。【参考方案9】:

Session.Abandon(); 也不适合我。

我必须编写它以使其工作的方式是这样的。也可能对你有用。

HttpContext.Current.Session.Abandon();

【讨论】:

以上是关于如何终止会话或会话 ID (ASP.NET/C#)的主要内容,如果未能解决你的问题,请参考以下文章

为啥数据库经此会话中的活动事务已由另外一个会话提交或终止

多点连接终止会话

如何在Linux中使用Shell脚本终止用户会话?

自动终止某些特定任务的会话

如何在开始新的会话之前终止当前的 php artisan serve 会话?

如何在 django 中关闭浏览器上的会话