2.3 进一步考虑
无论你决定使用隐藏帧还是XMLHttp,在构建Ajax应用程序时还有一些事情必须考虑。将JavaScript的角色延伸到服务器端程序逻辑中,能够带来一些强大的功能,但是也存在一些Web开发人员必须警惕的缺陷。
2.3.1 同源策略
由于Web浏览器是运行在用户的计算机上,浏览器厂商采取了一些安全限制技术,以防止恶意的代码对用户的机器造成破坏。对于JavaScript领域而言,最重要的安全限制是同源策略(same origin policy),它用来决定服务器能够相互通信的页面。
通常源(origin)是指诸如www.wrox.com的单个域,它可以通过单个协议访问,通常是HTTP。同源策略规定只有同源的页面才能访问、下载,以及与来自该源的资源进行交互(使用JavaScript)。对于隐藏帧技术而言,这要求所有的帧都是从相同的源装载的,因此可以使用JavaScript来通信。如果你尝试在帧中装载来自于其他源的页面,就不能够与这个页面进行交互或者访问其任何脚本。同源策略的意图是防止恶意程序员在合法的网页之外获取你的信息。
同源策略对于XMLHttp的工作也是有影响的。使用XMLHttp就不能访问与运行该代码的页面不同源的资源。这就意味着,默认情况下是不能够在open()方法中使用以http://开头的URL,只能够使用同一域名中的绝对URL或相对URL。如果你需要访问一个位于不同源中的URL,就必须创建一个服务器端代理来处理这个通信(参见图2-4)。

图 2-4
使用一个服务器端代理,浏览器可以将请求发给Web服务器。而Web服务器则与非本域中的另一台Web服务器联系,以请求适当的信息。当你的Web服务器收到响应时,就会把响应转发给浏览器。其结果就是外部数据可以进行无缝传输。在本书的后面部分中将会使用服务器端代理。
IE并未提供一个显式的同源策略,而是依赖于其自己的安全区域来决定能够访问什么。属于Internet安全区域的那些页面通常遵循的规则与同源策略相似,而属于受信任站点区域的页面则会免受该策略的限制。
2.3.2 缓存控制
只要处理对相同页面的重复调用,就必须考虑浏览器的缓存机制。在暗地里,Web浏览器会将已经下载和显示的网站存到缓存中,以提高其访问速度。对于经常访问的网站而言,这样会使访问速度大幅提高,但对于频繁更新的页面也会带来问题。如果你发出几个Ajax调用,必须意识到缓存机制可能会带来问题。
解决缓存机制带来的问题的最好方法是在服务器往浏览器发送的数据前面加上一个表示no-cache的首部,它的设置方法是:
Cache-Control: no-cache
这将告诉浏览器,对于来自该URL中的数据不做缓存处理。浏览器将总是从服务器调用一个新的版本,而不是从其缓存中找一个已保存的版本。







