Asp.net中安全退出时清空Session或Cookie的实例代码

所属分类: 网络编程 / ASP.NET 阅读数: 1438
收藏 0 赞 0 分享

概览:

网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问。这种所谓的退出并不是安全的。

那么怎样做到安全退出呢?

那就是点击退出后清空相应的Session或Cookie。

清空Session的代码:

Session.Clear();
Session.Abandon();

清除Cookie的正确代码(假设Cookie名称为UserInfo):

if (Request.Cookies["UserInfo"] != null)
{
Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(-1);
}

如果需要清除所有Cookie,则遍历:

for (int i = 0; i <Response.Cookies.Count; i++)
{
Response.Cookies[i].Expires = DateTime.Now.AddDays(-1);
}

清除Cookie的错误代码(假设Cookie名称为UserInfo):

if (Request.Cookies["UserInfo"] != null)
{
Response.Cookies.Remove("UserInfo");
}

你会发现,这样处理后,Cookie依然存在,为什么就是删不掉呢?我们去看看.NET的HttpCookieCollection实现源码:

public void Remove(string name)
{
if (this._response != null)
{
this._response.BeforeCookieCollectionChange();
}
this.RemoveCookie(name);
if (this._response != null)
{
this._response.OnCookieCollectionChange();
}
}

这个操作在HttpCookieCollection这个集合里面删除了cookie,当服务器将数据传输到客户端的时候,不会包含这个已经在服务端删除了的Cookie的任何信息,浏览器也就不会对它做任何改变(remove方法只是不让服务器向客户机发送那个被删除的cookie,与此cookie留不留在客户机里无关)。所以cookie删除不掉的情况就出现。

既然Response.Cookies.Remove没有办法实现我们需要的效果,为什么微软还有留着呢,因为CookieCollection实现ICollection接口,romove是必须实现的方法,尽管它没多大的实际价值。而集合的romove也应该是这样的实现方式,只不过微软在写MSDN的时候,描述得太不清楚了,给我们造成了不小的麻烦。

下面就总结下实现安全退出的几种方式:

1).用Linkbutton,Button等服务器控件实现退出

这种方式最好处理:直接在服务器控件对应的事件里编写清空Session或Cookie的代码即可。

2).用<a>注销</a>等HTML标记实现退出

对于<a></a>这个特殊标记,可以这样实现: <a href="logout.aspx">注销</a> ,在logout.aspx的Page_Load事件中编写清空Session或Cookie的代码即可。

对于<a></a>等HTML标记,可以在HTML标记的相应client事件中用Js-Ajax,或者jQuery-Ajax,在一般处理程序(.ashx)中编写清空Session或Cookie的代码即可。

对于<a></a>等HTML标记,还可以这样:在当前页面添加一个服务器控件如Button,用div包含,并让其隐藏(注意:隐藏不可见,不能通过服务器属性Visible=False,只能通过设置div的display:none;来实现),在Button的服务器事件Cilck里编写清空Session或Cookie的代码;然后在HTML标记的相应client事件中用Js或者jQuery调用Button控件的Click事件即可(通过服务器属性Visible=False设置Button隐藏,Js或者jQuery调用Button控件的Click事件将失效)。

以上所述是小编给大家介绍的Asp.net中安全退出时清空Session或Cookie的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

ASP.NET 水晶报表打印功能实现代码

ASP.NET下的水晶报表打印,据我所知有以下几种办法可以打印
收藏 0 赞 0 分享

ASP.Net 图片存入数据库的实现代码

在很多时候,我们有这样的需求:把图片存入到数据库当中。在一些应用程序中,我们可能有一些敏感的资料,由于存储在文件系统(file system)中的东西,将很容易被某些用户盗取,所以这些数据不能存放在文件系统中。
收藏 0 赞 0 分享

让Silverlight 2.0动画动起来Making Silverlight 2.0 animation Start(不能运动原因)

Microsoft Expression Blend 2 制作动画个人感觉倒像3DMAX 可以自动捕捉关键帧
收藏 0 赞 0 分享

asp.net Reporting Service在Web Application中的应用

由于我们这个项目中使用微软的报表服务(Reporting Services)作为报表输出工具,本人也对它进行一点点研究,虽没有入木三分,但这点知识至少可以在大部分Reporting Service的场景中应用。
收藏 0 赞 0 分享

C# 文件上传 默认最大为4M的解决方法

.net中默只能上传小于4m的文件,大于4M将无法显示页面.那么如何设置来使imputfile能上传更大的文件呢
收藏 0 赞 0 分享

asp.net 购物车实现详细代码

asp.net 购物车实现详细代码
收藏 0 赞 0 分享

asp.net repeater实现批量删除时注册多选框id到客户端

repeater批量删除时注册多选框id到客户端的实现代码
收藏 0 赞 0 分享

asp.net aspnetpager分页统计时与实际不符的解决办法

最近分页方面根据实际需要修改了一些函数
收藏 0 赞 0 分享

iis 服务器应用程序不可用的解决方法

访问页面时提示 服务器应用程序不可用,大家可以按照下面的方法重新注册下,应该能好点
收藏 0 赞 0 分享

asp.net button 绑定多个参数

asp.net button 绑定多个参数的代码
收藏 0 赞 0 分享
查看更多