JavaScript在发送Ajax请求时,URL的域名地址是使用绝对地址还是相对地址?
AJAX
AJAX(Asynchronous JavaScript and XML)是运用JavaScript和可扩展语言(XML)实现浏览器与服务器通信的一种技术。
相对地址
相对地址是相对存在的,就是被链接文件相对于当前页面的地址。
绝对地址
绝对地址是一条完整的路径,就是文件在网络或本地的绝对位置。具有唯一性。因此绝对地址能够提升打开的速度。
举个例子:
admin.js文件中的ajax如下:
$ajax({
//根目录
url:"/Handler/doValidation.ashx"
绝对路径,定位到根目录,本地下会从https://localhost:44380/开始,但是发布到服务器后放在其他文件夹下就会出问题,比如放在http://17.116.151.2/xm 这个文件夹下,以这种从根目录请求的形式请求的路径是http://17.116.151.2/Handler/doValidation.ashx缺少了xm文件夹,这样是找不到的
相对路径,去掉最前面的 斜杠 / ,但是不合适我的这种情况,admin.html和src/page文件夹中的 tool页面都引入了script下的admin.js,
如果使用相对路径admin请求的时候访问的路径是https://localhost:44380/Handler/doValidation.ashx
tool页面引用js中请求的路径是https://localhost:44380/src/page/Handler/doValidation.ashx,因为js的位置是相对于请求它的文件的位置的,
所以对于不同路径的文件引入同一js,不论在本地还是发布后都没办法使用相对路径
因为我现在想发布后能正常使用,解决的办法是
url:"/xm/Handler/doValidation.ashx" //使用绝对路径,路径中加上服务器中的文件夹
})
关于URL地址的问题
无论是使用相对地址还是绝对地址发送Ajax请求都是可以的,两者在发送请求时,服务器访问的地址都会转化为绝对地址。但如果使用相对地址的话,一定要注意填写正确,不然可能导致服务器访问的地址不是你想要的地址。
例如使用"login.java",服务器访问的可能是"http://localhost:8080/keti/login.java"。而"/test/login.java",服务器访问的可能是"http://localhost:8080/test/login.java"。最终访问到的结果不同。
Ajax发送请求过程
在Ajax中,通过XMLHttpRequest对象实现与服务器端的通信。在不同浏览器中有不同的创建对象方法,但使用方法是相同的。在XMLHttpRequest对象创建后,就可以对该对象进行各种不同的操作,从而完成于服务器的通信。
跨域
若在不同源的情况下访问,就称为跨域
跨域的产生来源于现代浏览器所通用的“同源策略”,所谓同源策略,指只有在地址的:
- 协议名:http,https
- 域名:http://a.study.cn http://study.cn
- 端口名
都一样的情况下,才允许访问相同的cookie、localStrage或是发送Ajax请求
【js跨域】js实现跨域访问的几种方式
1、通过jsonp跨域
在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。
通过修改document.domain来跨子域
2、通过修改document.domain来跨子域
浏览器都有一个同源策略,其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。 它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。有一点需要说明,不同的框架之间(父子或同辈),是能够获取到彼此的window对象的,但蛋疼的是你却不能使用获取到的window对象的属性和方法(html5中的postMessage方法是一个例外,还有些浏览器比如ie6也可以使用top、parent等少数几个属性),总之,你可以当做是只能获取到一个几乎无用的window对象。
3、使用window.name来进行跨域
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。