如何终止会话或会话 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#)的主要内容,如果未能解决你的问题,请参考以下文章