说说serverXMLHTTP对象与服务器的会话方式

我们先来看一个例子:

xmlhttp.asp代码:
<%
Set Xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
XmlHttp.Open "GET", "http://localhost/002.asp", false
XmlHttp.Send()
Response.Write(XmlHttp.ResponseText & "<br/>")
Set XmlHttp = Nothing
Response.Write(Session.SessionID)
%>

002.asp代码:
<%
Response.Write(Session.SessionID)
%>

下边是运行结果的截图:



从运行的结果我们可以总结出:serverXMLHTTP对象每调用一次Open方法就将产生一次新的会话(第一行值每次都不同);serverXMLHTTP对象产生的会话是独立于页面的会话的(两行值始终不同)!

我们再看一个例子:

在上边例子的基础上将xmlhttp.asp代码更改为:

<%
Set Xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
XmlHttp.Open "GET", "http://localhost/002.asp", false
XmlHttp.Send()
Response.Write(XmlHttp.ResponseText & "<br/>")
XmlHttp.Open "GET", "http://localhost/002.asp", false
XmlHttp.Send()
Response.Write(XmlHttp.ResponseText & "<br/>")
Set XmlHttp = Nothing
Response.Write(Session.SessionID)
%>

再来看看运行结果:



因而上边的总结还得加个条件:在页面一个生存期内,serverXMLHTTP对象无论调用多少次Open方法都属于同一次会话(前两行值始终相同);在页面新的生存期中,serverXMLHTTP对象第一次调用Open方法时都将产生一次新的会话(第一行值每次都不同);serverXMLHTTP对象产生的会话是独立于页面的会话的(前两行和第三行的值始终不同)!

结论:serverXMLHTTP不能用于会员登录类似的模块中!

基于上边的总结,我们不难推断出:客户端无法使用由serverXMLHTTP对象产生的会话,也就无法与服务器端维持由serverXMLHTTP对象产生的会话!因为当我们使用Session("XXX")时,使用的都是页面的会话(除非有办法根据SessionID值来与服务器端维持会话)。

假如我们将serverXMLHTTP用于会员登录系统中,流程应是这样的:通过serverXMLHTTP将会员登录信息发到指定WEB页中进行验证,WEB页中验证成功的话将用Session对象记录用户登录状态,但是在其他WEB页中由于无法读取serverXMLHTTP对象创建的Session对象中的值,因而都只能是显示未登录状态!

我们也举一个简单的例子进行说明:

index.asp代码:
<%
Set Xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
XmlHttp.Open "GET", "http://localhost/login.asp?username=admin", false
XmlHttp.Send()
Response.Write(XmlHttp.ResponseText)
Set XmlHttp = Nothing
%>
<a href="other.asp" target="_blank">other.asp</a>

login.asp代码:
<%
Session("username") = Request.QueryString("username")
Response.Charset = "GB2312"
Response.Write(Session("username") & "成功登录!")
%>

other.asp代码:
<%
If Session("username") = "" Then
    Response.Write("未登录!")
Else
    Response.Write(Session("username") & "成功登录!")
End If
%>

结果图:



我想这也是为什么动网、oBlog、动易三方联合制订的PDO通行接口中对于会员登录和注销必需借助构造script脚本来实现的真正原因吧。

评论: 6 | 引用: 0 | 查看次数: 13150
dnawo[2008-02-12 08:47 PM | | | 220.249.163.17 | del | 回复回复]
6#
所以才必须用构造脚本
sky717[2008-02-05 09:00 PM | | | 202.158.187.160 | del | 回复回复]
5#
在LOGIN.ASP 写一个 username=session("usernmae")
看index.asp这个页面能否读取login.asp的中的sessiuon("username")的值.如果可以就不用构造JS...可是我测试一N遍,还是不行的,,,
xilou[2007-08-31 09:04 AM | | | 125.92.221.44 | del | 回复回复]
4#
如果在asp中能实现"序列化"的功能就可以实现
dnawo[2007-08-31 08:46 AM | | | 59.56.6.162 | del | 回复回复]
地板
[quote]在服务器端使用 x.m.l.h.t.t.p 来对自己的服务器模拟用户请求,是对服务器资源的浪费。这也是a.sp的一大缺陷,脚本终究是脚本。dot n.e.t比它确实强多了。[/quote]

好在用的地方也不是很多,呵呵。

评论不允许发网址,h.t.t.p直接发会被阻止。
www[2007-08-30 09:46 PM | | | 122.48.0.104 | del | 回复回复]
板凳
无聊!
ashi[2007-08-30 07:21 PM | | | 221.219.198.3 | del | 回复回复]
沙发
在服务器端使用 x.m.l.h.t.t.p 来对自己的服务器模拟用户请求,是对服务器资源的浪费。这也是a.sp的一大缺陷,脚本终究是脚本。dot n.e.t比它确实强多了。

请问,我到底那个字是违规的?不解,非要加上.才能发?
发表评论
登录后再发表评论!