AJAX(XMLHttpRequest)开展跨域请求方法详解(三)
AJAX(XMLHttpRequest)进行跨域请求方法详解(三)
3,带验证信息的请求
身份验证是Web开发中经常遇到的问题,在跨域请求中,默认情况下是不发送验证信息的。要想发送验证信息,需要进行withCredentials 属性,下面就是一个简单请求的例子:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- < html xmlns = "http://www.w3.org/1999/xhtml" >
- < head >
- < title > AJAX跨域请求测试 </ title >
- </ head >
- < body >
- < input type = 'button' value = '开始测试' onclick = 'crossDomainRequest()' />
- < div id = "content" > </ div >
- < mce:script type = "text/javascript" > <!--
- var xhr = new XMLHttpRequest();
- var url = 'http://dotnet.aspx.cc/RequestsWithCredentials.aspx' ;
- function crossDomainRequest() {
- document.getElementById("content").innerHTML = "开始进行请求……" ;
- if (xhr) {
- xhr.open('GET', url, true);
- xhr.onreadystatechange = handler ;
- xhr.withCredentials = "true" ;
- xhr.send();
- } else {
- document.getElementById("content").innerHTML = "不能创建 XMLHttpRequest。" ;
- }
- }
- function handler(evtXHR) {
- if (xhr.readyState == 4) {
- if (xhr.status == 200) {
- var response = xhr .responseText;
- document.getElementById("content").innerHTML = "结果:" + response;
- } else {
- document.getElementById("content").innerHTML += "< br /> 执行状态 status:" + xhr.status;
- }
- }
- else {
- document.getElementById("content").innerHTML += "< br /> 执行状态 readyState:" + xhr.readyState;
- }
- }
- // --> </ mce:script >
- </ body >
- </ html >
点击“开始测试”,我们可以检测到下面的请求执行过程:
- GET /RequestsWithCredentials.aspx HTTP/1.1
- Host: dotnet.aspx.cc
- User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)
- Accept: text/html,application/xhtml+xml,application/xml;q = 0 .9,*/*; q = 0 .8
- Accept-Language: zh-cn,zh;q = 0 .5
- Accept-Encoding: gzip,deflate
- Accept-Charset: GB2312,utf-8;q = 0 .7,*; q = 0 .7
- Keep-Alive: 300
- Connection: keep-alive
- Referer: http://www.meng_xian_hui.com:801/CrossDomainAjax/RequestsWithCredentials.html
- Origin: http://www.meng_xian_hui.com:801
- HTTP/1.x 200 OK
- Date: Sun, 10 Jan 2010 14:12:26 GMT
- Server: Microsoft-IIS/6.0
- X-Powered-By: ASP.NET
- X-AspNet-Version: 2.0.50727
- Access-Control-Allow-Origin: http://www.meng_xian_hui.com:801
- Access-Control-Allow-Credentials: true
- Set-Cookie: ASP.NET_SessionId = fn2zf0zq1cuwgf45fm5fw145 ; path =/; HttpOnly
- Set-Cookie: visit = 1 ; expires = Sun , 10-Jan-2010 14:12:56 GMT; path =/
- Cache-Control: no-cache
- Pragma: no-cache
- Expires: -1
- Content-Type: text/html; charset = utf -8
- Content-Length: 1
从上面的响应中可以看出,Cookie 是会随请求一起发送的。如果我们多次点击测试按钮,则可以看到请求和响应的结果是这样的:
- GET /RequestsWithCredentials.aspx HTTP/1.1
- Host: dotnet.aspx.cc
- User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)
- Accept: text/html,application/xhtml+xml,application/xml;q = 0 .9,*/*; q = 0 .8
- Accept-Language: zh-cn,zh;q = 0 .5
- Accept-Encoding: gzip,deflate
- Accept-Charset: GB2312,utf-8;q = 0 .7,*; q = 0 .7
- Keep-Alive: 300
- Connection: keep-alive
- Referer: http://www.meng_xian_hui.com:801/CrossDomainAjax/RequestsWithCredentials.html
- Origin: http://www.meng_xian_hui.com:801
- Cookie: ASP.NET_SessionId = fn2zf0zq1cuwgf45fm5fw145 ; visit = 2
- HTTP/1.x 200 OK
- Date: Sun, 10 Jan 2010 14:13:58 GMT
- Server: Microsoft-IIS/6.0
- X-Powered-By: ASP.NET
- X-AspNet-Version: 2.0.50727
- Access-Control-Allow-Origin: http://www.meng_xian_hui.com:801
- Access-Control-Allow-Credentials: true
- Set-Cookie: visit = 3 ; expires = Sun , 10-Jan-2010 14:14:28 GMT; path =/
- Cache-Control: no-cache
- Pragma: no-cache
- Expires: -1
- Content-Type: text/html; charset = utf -8
- Content-Length: 1
注意 Cookie: ASP.NET_SessionId=fn2zf0zq1cuwgf45fm5fw145; visit=2 这一行,访问计数器已经被一起发送到服务器。
4,IE8 中的实现方法
IE8已经开始支持跨域访问资源了,但是,IE8提供的功能还比较简单,可以进行简单的请求,下面是一个使用的例子:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- < html xmlns = "http://www.w3.org/1999/xhtml" >
- < head >
- < title > 孟宪会之AJAX跨域请求测试 </ title >
- </ head >
- < body >
- < input type = 'button' value = '开始测试' onclick = 'crossDomainRequest()' />
- < div id = "content" > </ div >
- < mce:script type = "text/javascript" > <!--
- var xhr = new XDomainRequest();
- var url = 'http://dotnet.aspx.cc/SimpleCrossSiteRequests.aspx' ;
- function crossDomainRequest() {
- document.getElementById("content").innerHTML = "开始……" ;
- if (xhr) {
- xhr.open('GET', url);
- xhr.onload = handler ;
- xhr.send();
- } else {
- document.getElementById("content").innerHTML = "不能创建 XDomainRequest" ;
- }
- }
- function handler(evtXHR) {
- document.getElementById("content").innerHTML = "结果:" + xhr.responseText;
- }
- // --> </ mce:script >
- </ body >
-
</
html
>