日期:2014-05-20  浏览次数:20432 次

请教客户端点击叉关闭页面后直接清空Session的方法
如果用户点击关闭按钮,那么提交到服务器端进行Session.Abandon()清空!但有的用户会直接点击页面右上角的叉关闭页面,我使用客户端的onunload()方法进行页面提交再清空,可现在无法判断出哪张页面是最后的客户端页面,希望用户关闭最末张页面时才进行提交清空的!
还有个问题,在使用到window.showModalDialog()方法时,页面经常会在客户端浏览器中缓存,除非将浏览器的《每次访问此页时检查》选项选中才可,但不能保证每个用户都会这么做,那我在服务器端如何处理呢?
以上两个问题请大家帮忙!

------解决方案--------------------
1:
这种操作只能使用客户端脚本进行。如果用户使用浏览器正常操作,在他关闭最后一个窗口后,或者是与该页相关的窗口,浏览器就丢掉了此 Session 相关的 Cookie 数据,不知道你要清空它干什么用处;如果用户是非正常浏览,比如自己写程序访问网页,那你的客户端脚本也起不到作用。

2:
你每次请求这个页面时在 URL 上传个随机数,或者传个时间,比如:“http://aaa.com/a.aspx?R=23523534634523432”
------解决方案--------------------
onunload在任何更新客户端页面历史的时候都会触发,不论是访问网站自己的网页、网站以外的网页、关闭窗口都会触发。随意你不能在关闭的当时去判断,只能等一段时间。你开可以在你“页面提交再清空”的时候触发应用程序中的一个timer线程,例如等待时间为10秒钟,到时间再执行。然后每当页面装载的时候,如果这个线程存在则清除它。

然后这并不能处理那些“发呆”的客户,也不能处理那些由于各种原因根本就是与服务器时去了联系的客户。

比较可靠的办法是每一个页面都定时(例如10秒)访问一下服务器上的“页面提交表示在线”页面,将最后访问时间保存在服务器某个的地方,并且需要这个信息的程序可以访问某个用户的最后访问时间来判断是否超时(例如超过20秒钟算超时)。例如你可以为每一个Session使用一个线程每隔10秒钟去查询一下是否在线。

至于第二个问题,我使禁止在模式窗口中使用asp.net的,只能使用html+javascript。模式窗口的操作逻辑与普通窗口根本不同。