如何终止 ASP.NET/C# 中的会话或会话 ID

33

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

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

我尝试过:

Session.Abandon();Session.Contents.Remove("Name"); 两者都无效。(我从Google搜索中的一个论坛中找到了这些方法)


“neither of them work” 是什么意思? - Bob
嗯... 当我输出session ["Name"]的内容时,它仍然输出名称,但实际上它不应该,因为它应该被清除或删除。而且它没有让我退出登录。所以,这就是我所说的“它们都不起作用”的意思。 - anon271334
尝试添加重定向回登录页面,在那里检查Session ["Name"]。 - Bob
也许这个链接可以帮助你。 - shruti
Abaondon方法是有效的,你只需要从HTML脚本中删除postbackurl并在Session.Abandon()之后添加重定向即可。 - user1203768
使用 Session["YourItem"] = ""; - orf
9个回答

63

Abandon方法应该可行 (MSDN):

Session.Abandon();

如果你想从session中删除一个特定的项目,可以使用(MSDN):

Session.Remove("YourItem");

编辑:如果您只想清除一个值,可以执行以下操作:

Session["YourItem"] = null;

如果你想清除所有的键(key),请执行以下操作:

Session.Clear();

如果这些方法都没有起作用,那么可能出了一些问题。建议检查赋值的位置,并确认在清空值之后未被重新赋值。

简单的检查方式如下:

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

1
谢谢,@Kelsey;我刚刚更新了我的问题,展示了我已经尝试过的内容。放弃方法不起作用:S - anon271334
@Lucifer,你是想从当前会话中终止“Session”,还是想在应用程序级别定位并终止特定的会话? - Kelsey
从当前会话中,您想要什么? - anon271334
@Lucifer,我怀疑还有其他问题。我已经编辑了我的答案,包括一些检查和其他选项。 - Kelsey
谢谢@Kelsey,我没有看到任何来自那个检查的结果。 - anon271334
1
@Lucifer,你期望的结果是什么?在Remove之后,该值将为“null”。你想要发生更多的事情吗? - Kelsey

8

另外,建议指示客户端浏览器清除会话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()就足够了? - love2code

5

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。调用的Web服务器可能会对此做出反应,也可能不会,但是ASP没有立即采取任何行动。 (我通过.net-Reflector进行了检查)

实际上,您可以通过单击浏览器的后退按钮一次并继续正常浏览网站来继续使用旧会话。

因此,总结一下:请使用Session.Clear()以避免不必要的麻烦。

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


1

Session.Abandon() 这会销毁数据。

请注意,这并不一定真正从用户中删除会话令牌,同一个会话令牌在以后的某个时间点可能会被捡起并创建为具有相同 ID 的新会话,因为它被认为是公平竞争的。


谢谢@Chris,我已经尝试过了,它仍然输出session["Name"]的内容,并且无法注销。 - anon271334

1
Session["YourItem"] = "";

在 .net razor 网页中表现良好。

3
尽管这个代码示例可能回答了问题,但最好还是在你的答案中包含一些必要的解释。如此现状下,这个回答对于未来的读者几乎没有任何价值。 - oɔɯǝɹ

1

你可以像这样终止一个会话:

Session.Abandon()

如果你只想清空会话,可以使用以下代码:

Session.Clear()

如果你只是想删除“Name”,你可以使用 Session.Remove("Name"); 或者使用 Session["Name"] = null; 来清除它。 - Chris Cashwell
1
这些都不起作用。我尝试了Session.Abandon(); Session.Contents.Remove("Name"); Session.Contents.RemoveAll(); Session.Clear(); Session["Name"] = null(最初我做的就是这个),但它们都不起作用。 - anon271334

1
Session.Abandon()

你应该使用的是这个。问题在于,ASP.NET 在幕后会销毁会话,但会立即在下一个页面请求中为用户提供全新的会话。因此,如果你在调用 abandon 后立即检查会话是否消失,它看起来好像没有起作用。


请查看MSDN文档中Session.Abandon的备注部分 -> http://msdn.microsoft.com/zh-cn/library/ms524310.aspx - Alan Barber
谢谢@AlanB-那么,如果会话不被删除,我如何在点击SignOut按钮后立即退出我的“帐户”? - anon271334
我猜这取决于你正在编写的代码,但基本操作是如果你在页面上有一个“注销”按钮,在代码中执行session.abandon()调用,然后重定向到主页。主页的加载应该有一个新的会话,因此不再“登录”。他们将拥有一个新的会话,但与旧会话相关的所有数据都已消失。 - Alan Barber

1

Session.Abandon(); 对我也没有起作用。

我必须这样编写才能使其正常工作。这种方法可能对您也有用。

HttpContext.Current.Session.Abandon();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接