死忠的死士全文加番外:让人无法解释的现象(ASP程序)
来源:百度文库 编辑:高校问答 时间:2024/10/06 09:31:08
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
运行这段程序,然后不断刷新此页面
分析一下应该是一个加1计数功能
可是输出结果却让人吃惊!!!
谁能解释,我是百度新手,编程却有一段时间
没有高分,但求好解!!
这位朋友,你先运行下我的程序再回答好吗?
看好,不断刷新页面,看页面输出
我再强调一下,你们先运行一下再说!!
三楼四楼的朋友好搞笑
我不是要这样的结果,我是要这样的程序结果的解释
计数系统我是有的!
五楼的兄弟你运行没?
六楼的兄弟说的没错,可是你知道为什么呢?再具体点,就是因为那个颜色的#号,谁能给我个解释?
七楼兄弟说得有点上路了..谢谢你的参与,本来我想结束,但是我还想听听别人的说法..另外我想得到你补充的答案HOHO....
<body>导致的
<body>导致的
补充:首先声明,偶也解释不了~
这贴越来越有意思了,偶也接着聊几句
测试一下Mouse_ye的代码,发现问题出在<body background="#e8e8e8"> 这一句里,而这一句是有问题的
background是定义背景图片的,不是背景色,这么写背景色根本不显示,针对这一句作如下测试:
测试一:
<body bgcolor="#e8e8e8">
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
这是正确显示背景色的代码,session也可以正常的增加1
测试二:
<div div="#e8e8e8">
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</div>
这是不能显示背景色的代码,我把body分别换成了div,p,input,session也可以正常的增加1,这说明有可能仅对body等极少数的元素代码错误才可能出现这种情况
测试三:
<body topmargin="#e8e8e8">
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
这里属性的设置一定是错误的,不过session却可以正常加1,我又试着用align,leftmargin,alink测试,都没问题,这同样说明,仅有background等少数属性设置错误才可能引起
同理,我又把#直接替换成@,&,*,$试一下,都可以正常加1,说明#也是不能少的
至少目前看来,要出现那种情况,在代码错误的情况下body,background,#,是都不能少的
测试四:
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
我用抓包工具抓了一下
send:
GET /test/1/a.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Host: localhost
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSAABBAA=DPGBDFCAODKAMMMOJIJOHGBO
WSARecv:
HTTP/1.1 200 OK
Date: Fri, 03 Mar 2006 17:28:49 GMT
Server: Microsoft-IIS/6.0
Content-Length: 13
Content-Type: text/html
Cache-control: private
1
</body>
再试一下把<body background="#e8e8e8">加上的情况,
多了一个send和WSARecv,看来是错误代码引起,第二个send里多了一个Referer(为什么会有?): http://localhost/test/1/a.asp
再WSARecv:第一个看来也没什么问题,为1,而第二个WSARecv居然是2,我晕,浏览器显示为1的时候,session已经是2了?
难道是错误代码导致了第二个send,导致session刷新,在response完成以后使WSARecv接收到新的数据?
写了一段代码用抓包工具抓了一下:
<body background="#e8e8e8">
<%
Randomize()
response.write int(100*rnd)
%>
</body>
果然抓到了没在浏览器上显示的第二个伪随机数
过程是大概是这样,不过其中的原理却是百思不得其解,说了这么多废话不过是抛砖引玉,有砖尽管来拍,期待David_Dai兄的结论~
附:看了David_Dai兄其它的贴,果然是上知天文,下晓编程,嘿嘿~
response.write是服务器向客户端返回信息,而你的变量nik的值是每次都加1的,也就是说,每次nik 值增加一次就要从服务器返回一次信息,而nik没有限制,就要一直增加下去,你的页面就要不断刷新,!!我是这样理解的,不知道正不正确!!!
谢谢! 你的问题靠思考得很好!
暂时我还解释不了!
我在IE 中 每刷新一次 Nik 增加 1 ~3
在 MYIE 中 Nik 每次稳定的增加 2
我用netbox 和 babyweb 作服务器还是同样的结果:
IE 中 每刷新一次 Nik 增加 1 ~3
在 MYIE 中 Nik 每次稳定的增加 2
去掉了 background="#e8e8e8" 后就可以稳定的 以 1 为增量变化了,
从表面现象分析来看
其中变化肯定发生在 客户端。
客户端察看这个页面 用到了几个 或者 几次Session
我想是不是 客户段动用了多线程技术,下载网页数据 而造成如此结果?
当然这只是一个 猜想 没有依据 最好调用服务器日志分析一下
这中间具体发生了什么事 我会在一段时间后 来这里补上
我来了!
首先 谢谢!失落的糖果 的 表扬!
同时 我从 糖果兄 这里受到启发!
引用一段 糖果兄的 文字:
=========================
测试一下Mouse_ye的代码,发现问题出在<body background="#e8e8e8"> 这一句里,而这一句是有问题的
background是定义背景图片的,不是背景色,这么写背景色根本不显示,针对这一句作如下测试:
测试一:
<body bgcolor="#e8e8e8">
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
这是正确显示背景色的代码,session也可以正常的增加1
测试二:
<div div="#e8e8e8">
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</div>
这是不能显示背景色的代码,我把body分别换成了div,p,input,session也可以正常的增加1,这说明有可能仅对body等极少数的元素代码错误才可能出现这种情况
测试三:
<body topmargin="#e8e8e8">
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
这里属性的设置一定是错误的,不过session却可以正常加1,我又试着用align,leftmargin,alink测试,都没问题,这同样说明,仅有background等少数属性设置错误才可能引起
同理,我又把#直接替换成@,&,*,$试一下,都可以正常加1,说明#也是不能少的
至少目前看来,要出现那种情况,在代码错误的情况下body,background,#,是都不能少的
测试四:
<%
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
我用抓包工具抓了一下
send:
GET /test/1/a.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Host: localhost
Connection: Keep-Alive
Cookie: ASPSESSIONIDCSAABBAA=DPGBDFCAODKAMMMOJIJOHGBO
WSARecv:
HTTP/1.1 200 OK
Date: Fri, 03 Mar 2006 17:28:49 GMT
Server: Microsoft-IIS/6.0
Content-Length: 13
Content-Type: text/html
Cache-control: private
1
</body>
再试一下把<body background="#e8e8e8">加上的情况,
多了一个send和WSARecv,看来是错误代码引起,第二个send里多了一个Referer(为什么会有?): http://localhost/test/1/a.asp
再WSARecv:第一个看来也没什么问题,为1,而第二个WSARecv居然是2,我晕,浏览器显示为1的时候,session已经是2了?
难道是错误代码导致了第二个send,导致session刷新,在response完成以后使WSARecv接收到新的数据?
写了一段代码用抓包工具抓了一下:
<body background="#e8e8e8">
<%
Randomize()
response.write int(100*rnd)
%>
</body>
果然抓到了没在浏览器上显示的第二个伪随机数
===================
应该说 糖果兄 的思路是正确的 他做了我 没做的测试
对不起最近 工作忙了点不过很快 我就 可以找答答案了!
当然,答案是 我自己 分析的结果
如有不同 还望大家指正!
<body background="#e8e8e8">
<%
if session("nik")="" then session("nik")=0
Session("Nik")=Session("Nik")+1
response.write Session("Nik")
%>
</body>
SESSION是做什么应该知道吧!
你不停刷新相当于一个循环。
应该是会话线程。可能最大只能到3
在我的空间上运行结果和楼主的分析是一样的,是记录了刷新多少次,不是计数功能,因为他并不影响数据库