asp.net关于session不能及时清空。
我用asp.net做了一个网站,获取一个session然后输出,点击一个按钮,我明明在这里加清除session为空的代码,可以用VS2010调试的时候加断点一步一步走,s...
我用asp.net做了一个网站,获取一个session然后输出,点击一个按钮,我明明在这里加清除session为空的代码,可以用VS2010调试的时候加断点一步一步走,session可以清空,但直接右击文件,在浏览器里查看的时候session不清空,每次内容都是上次的内容加这次的内容。希望见过这个问题的大神能帮我下,在线等。
展开
4个回答
2013-11-21
展开全部
后台是没有办法直接捕获到的,不过可以通过在页面中加入以下脚本让浏览器关闭时触发一次提交
<script>
window.onunload=function(){
if(event.clientX>document.body.clientWidth && event.clientY < 0 || event.altKey) //如果是关闭浏览器而不是刷新页面
__doPostBack('closing',''); //触发一次提交
}
</script>
然后即可在后台此动作进行捕获
protected void Page_Load(object sender, EventArgs e)
{
if (Request["__EVENTTARGET"] == "closing")
{
...最后的处理...
Response.End(); //因为是最后的处理,不需要页面输出,所以执行到这里就可以了
}
...原有的正常代码...
}
有些情况下,页面不会自动生成__doPostBack函数即其相关控件(如:页面上只有Button控件时),可以在页面上手工添加以下代码:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
以上方法对于用户通过任务管理器中止IE进程之类的“狠招”没有任务办法...
另外还有个缺点:
1.只有在用户关闭浏览器时才会触发,如果是页面跳转就捕获不到了
2.当然也可以把那个脚本改成
<script>
window.onunload=function(){ __doPostBack('closing','');}
</script>
这样,不管如果都会触发提交,但是问题更大,因为即使是用户进行正常的页面提交,比如点击页面上的某个按钮也会触发这个事件!
3.解决办法是使用UpdatePanel,这样普通的提交是不会刷新页面的,也就不会触发window.onunload事件了。但是还有一个问题,就是当第一次页面发生跳转时(不管是后台控制还是前面用户操作的)都会使页面变成一个空白页面。因为那个脚本强制让页面刷新了一下,导致跳转失效,而后台捕获到了closing参数,处理完后终止了输出,导致页面变成了空白页。
4.也有办法解决后台控制的跳转问题,前是前台用户修改地址栏这样的跳转就没有办法了,不想细写了,反正我没找到一个完美的解决办法。
PS:以上方法还有一个恶心的用途,把后台的那句"Response.End();"去掉后,就可以让用户永远离开你的页面(包括修改地址栏和点击
等),除非关闭浏览器
另外再提供一个解决的思路,可以较好的实现页面关闭或页面跳转后的处理,但是实现起来相对麻烦些。就是用ajax做“心跳”:当用户打开你的页面时,保存一个对应的
以及页面关闭后要做的处理中用到的相关信息。在页面中加入一个时间
,每过一段时间(比如8秒)就用ajax提交一次,刷新用户对应的
。(也可以在global的sessionstart中进行
的创建,并用sessionid作为标识进行刷新,这样可以不局限于一个页面,做到仅当用户关闭所有打开你的站点的窗口之后才触发,灵活性非常高)另外用一个线程,每过一段时间去检查这个保存的时间戳(比如20秒),如果发现每个时间戳和系统当前时间相差大于等于
(比如20秒)即认定用户关闭了浏览器或跳转到别的页面了,然后就可以进行你要的处理了。
写得很乱,不知道你能看明白不?
<script>
window.onunload=function(){
if(event.clientX>document.body.clientWidth && event.clientY < 0 || event.altKey) //如果是关闭浏览器而不是刷新页面
__doPostBack('closing',''); //触发一次提交
}
</script>
然后即可在后台此动作进行捕获
protected void Page_Load(object sender, EventArgs e)
{
if (Request["__EVENTTARGET"] == "closing")
{
...最后的处理...
Response.End(); //因为是最后的处理,不需要页面输出,所以执行到这里就可以了
}
...原有的正常代码...
}
有些情况下,页面不会自动生成__doPostBack函数即其相关控件(如:页面上只有Button控件时),可以在页面上手工添加以下代码:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
以上方法对于用户通过任务管理器中止IE进程之类的“狠招”没有任务办法...
另外还有个缺点:
1.只有在用户关闭浏览器时才会触发,如果是页面跳转就捕获不到了
2.当然也可以把那个脚本改成
<script>
window.onunload=function(){ __doPostBack('closing','');}
</script>
这样,不管如果都会触发提交,但是问题更大,因为即使是用户进行正常的页面提交,比如点击页面上的某个按钮也会触发这个事件!
3.解决办法是使用UpdatePanel,这样普通的提交是不会刷新页面的,也就不会触发window.onunload事件了。但是还有一个问题,就是当第一次页面发生跳转时(不管是后台控制还是前面用户操作的)都会使页面变成一个空白页面。因为那个脚本强制让页面刷新了一下,导致跳转失效,而后台捕获到了closing参数,处理完后终止了输出,导致页面变成了空白页。
4.也有办法解决后台控制的跳转问题,前是前台用户修改地址栏这样的跳转就没有办法了,不想细写了,反正我没找到一个完美的解决办法。
PS:以上方法还有一个恶心的用途,把后台的那句"Response.End();"去掉后,就可以让用户永远离开你的页面(包括修改地址栏和点击
等),除非关闭浏览器
另外再提供一个解决的思路,可以较好的实现页面关闭或页面跳转后的处理,但是实现起来相对麻烦些。就是用ajax做“心跳”:当用户打开你的页面时,保存一个对应的
以及页面关闭后要做的处理中用到的相关信息。在页面中加入一个时间
,每过一段时间(比如8秒)就用ajax提交一次,刷新用户对应的
。(也可以在global的sessionstart中进行
的创建,并用sessionid作为标识进行刷新,这样可以不局限于一个页面,做到仅当用户关闭所有打开你的站点的窗口之后才触发,灵活性非常高)另外用一个线程,每过一段时间去检查这个保存的时间戳(比如20秒),如果发现每个时间戳和系统当前时间相差大于等于
(比如20秒)即认定用户关闭了浏览器或跳转到别的页面了,然后就可以进行你要的处理了。
写得很乱,不知道你能看明白不?
追问
不晓得大神可否 个Q,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议不适用session,直接使用http://网址?变量=参数方法传递参数
追问
好的谢谢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我记得我写的时候调用的是destory()方法。。。貌似不会出现你这样的情况。。
追问
谢谢,已经找到问题了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
好像是iis 服务器的问题。不过你可以试一下 Session.销毁事件
更多追问追答
追问
我不太懂,为什么设一个断点然后一步一步走的时候好用,但直接在浏览器里看的时候问题就出来了。而且在浏览器里的时候,数据库还存不到数据库里。
追答
运行的坏境不一样的,可以看一下你代码吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询