Asp.net中安全退出时清空Session或Cookie的实例代码
概览:
网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问。这种所谓的退出并不是安全的。
那么怎样做到安全退出呢?
那就是点击退出后清空相应的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的实例代码,希望对大家有所帮助
下一篇: 十年精华收藏关于路由和路由协议的漏洞