2.5 罗马不是一夜建成的——从简单 URL 请求到整张地图
从前面 2.3 节的例子中我们可以看到,如果您使用的是用 asp.net 实现的 web 层组件,并采用的是 AJAX 阅读器,那么,一般来说,您的 MapGuide 的页面都是从如下面所示的这样一个 URL 请求开始的:
http://localhost/mapguide/mapviewerajax/ajaxviewer.aspx?WEBLAYOUT=< 网页布局的资源标识 >
对于其他语言实现的 web 层组件,除了 ajaxviewer 页面的后缀不同,其余部分是一样的。
由于安装包会把 ajaxviewer 页面作为这个路径下的默认文件,所以这个 URL 也可以写做 http://localhost/mapguide/mapviewerajax/?WEBLAYOUT=< 网页布局的资源标识 > 。如果您使用的是服务器版,请用“ mapguide+ 版本号”(如 mapguide2010 )来替代路径中的 mapguide 。
下面,我们就看看服务器端会如何去响应这个 URL 。下面的讲解,是以 asp.net 实现的 web 层组件作为例子的。其他语言实现的 web 层控件,虽然内容稍有不同,但原理是一样的。
2.5.1 把敌人挡在门外—— MapGuide 的认证机制
如果您仔细观察过 AJAX 阅读器的默认页面 ajaxviewer 和 DWF 阅读器的默认页面 dwfviewer 的话,您会发现这两个页面的作用仅仅是设置一个名为 forDwf 的变量(这个变量将来会在代码中用于区分是 AJAX 阅读器还是 DWF 阅读器),然后就把控制权交给了 mainframe 页面。
Mainframe 第一次接到请求时,这个请求是没有登录信息的,会在 67 行调用 RequestAuthentication 函数,这个函数会给浏览器返回一个状态为 401 的 HTTP 响应,表示需要用户进一步输入认证信息。这里要注意的是, HTTP 协议虽然规定了状态 401 表示需要进一步输入认证信息,却没有规定浏览器用什么样的方式来让用户输入,因此,不同浏览器对此的反应并不是完全一致的。下图 2-4 显示了部分浏览器用来输入认证信息的界面。
图 2-4(1) Windows 7 下 Internet Explorer 8 的认证界面
图 2-4(2)FireFox 3.5 的认证界面
用户输入用户名和密码之后, mainframe 会第二次接收到请求,由于这个请求包含有登录信息, mainframe 会利用登录信息打开一个 MgSiteConnection ,并借由这个连接创建一个会话。创建会话的函数会返回标识该会话的一个字符串,以后的页面都依靠这个字符串来表示自己是运行在哪个会话中的。
如果您想像 2.3 节中那样有自己的登录页面,或者您想让用户都以您指定的用户名密码登录(一个最典型的例子是,所有来自网页访问都利用 guest 账户登录),您可以在访问 mainframe ,也就是 ajaxviewer 时候,在 URL 中加上 username 和 password 两个参数,即采用如下格式:
http://localhost/mapguide/mapviewerajax/?WEBLAYOUT=< 网页布局文件的资源标识 >&USERNAME=< 用户名 >&PASSWORD=< 密码 >
如:
http://localhost/mapguide/mapviewerajax/?weblayout=Library://HelloViewer/HelloViewer.WebLayout&username=guest&password=guest
要注意的是,这种方法由于密码是直接放置在 URL 中,所以仅用于对保密性要求不高的场合,比如用于 guest 账户的登录。如果想要密码不出现在 URL 中,可以像 2.3 节中的例子那样,用一个表单将这两个参数用 POST 的方式提交到 ajaxviewer 页面中。
还有一种特殊的情况,就是您已经通过其他途径创建了一个会话,而想让 mainframe 直接使用这个会话,这也是可以的。您只要在 URL 中加上 session 这个参数,并用会话标识字符串作为它的值,即采用如下格式:
http://localhost/mapguide/?WEBLAYOUT=< 网页布局文件的资源标识 >&SESSION=< 会话标识 >
如
http://localhost/mapguide/mapviewerajax/?weblayout=Library://HelloViewer/HelloViewer.WebLayout&session=290058d2-cc7b-102c-8000-0013a93ebc6b_en_7F0000010AFC0AFB0AFA
同样,为了安全起见,您也可以通过表单来将这个参数用 POST 的方式提交到 ajaxviewer 页面中,来避免在页面 URL 中直接出现会话的标识。
现在我们的网页已经成功登录到 MapGuide 服务器上了,那么,下面我们来看看各个框架都是怎样初始化的。