33

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

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

我努力了:

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

4

9 回答 9

63

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
于 2011-03-16T18:53:08.477 回答
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);
于 2016-10-12T08:32:12.377 回答
5

会话.Abandon()

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

于 2011-03-16T18:53:47.603 回答
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 可能表现不同。

于 2013-04-03T13:59:44.320 回答
1

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

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

于 2011-03-16T18:53:46.370 回答
1

你像这样杀死一个会话:

Session.Abandon()

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

Session.Clear()
于 2011-03-16T18:54:02.870 回答
1
Session["YourItem"] = "";

在 .net razor 网页中效果很好。

于 2015-02-01T09:23:38.963 回答
1
Session.Abandon()

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

于 2011-03-16T19:02:18.857 回答
1

Session.Abandon();也没有为我工作。

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

HttpContext.Current.Session.Abandon();
于 2016-02-23T23:35:15.340 回答