跟我说,这个需要一些解释.
我正在帮助构建混合移动Web应用程序.主要代码库是HTML5和JavaScript,它将包装在本机移动Web视图(一个电话空间)中.
部分功能要求应用程序将信息发布到由我们的客户控制的Web服务.由于其他人正在使用此Web服务,因此几乎没有空间可以更改此Web服务.我们使用HTTP POST发送JSON并从服务器接收响应.此响应的一部分是一个JSESSIONID cookie,用于管理与服务器的会话.在初始initSession()调用之后,我们需要使用每个(AJAX)请求发送JSESSIONID cookie.
当部署在移动设备上时,Web应用程序将包装在本机Web视图中,该视图通过浏览启动Web应用程序file:///path/to/app/index.html.
我们尝试的第一件事是要求我们的客户Access-Control-Allow-Origin: *在其响应头中设置允许CORS.然后我们尝试发布到服务器:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
Run Code Online (Sandbox Code Playgroud)
监控请求,显然没有包含cookie.仔细观察后,CORS规范中有一个特殊部分用于处理用户凭证,其中包括会话cookie.所以我修改了AJAX调用以包含这个:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
Run Code Online (Sandbox Code Playgroud)
另一个错误,这次来自浏览器.更多阅读产生了以下内容:
如果第三方服务器没有响应
Access-Control-Allow-Credentials: true标头,则响应将被忽略,并且不可用于Web内容.重要说明:在响应凭证请求时,服务器必须在
Access-Control-Allow-Origin标头中指定域,并且不能使用通配符.
因此,我们需要更改服务器的标头以包含Access-Control-Allow-Credentials: true和Access-Control-Allow-Origin我们的Origin.
在这里,我们终于遇到了一个问题:使用file:// protocol加载网页时Origin,Web View发送的请求标头设置为null.因此无法由服务器解析,因此服务器无法将其设置为Access-Control-Allow-Origin.但是,如果服务器不能设置Access-Control-Allow-Origin到其他的东西比* …
我编写了一个运行良好的XMLHttpRequest,但返回一个空的responseText.
javascript如下:
var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
var myRequest = new XMLHttpRequest();
callAjax(anUrl);
function callAjax(url) {
myRequest.open("GET", url, true);
myRequest.onreadystatechange = responseAjax;
myRequest.setRequestHeader("Cache-Control", "no-cache");
myRequest.send(null);
}
function responseAjax() {
if(myRequest.readyState == 4) {
if(myRequest.status == 200) {
result = myRequest.responseText;
alert(result);
alert("we made it");
} else {
alert( " An error has occurred: " + myRequest.statusText);
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码运行正常.我可以走过去,我得到readyState == 4和状态== 200但是responseText总是空白.
我收到错误调度的日志错误(在Safari调试中):getProperties,我似乎无法找到引用.
我在本地和远程服务器上运行Safari和Firefox中的代码.
放入浏览器时的URL将返回字符串并提供状态代码200.
我在Mac Widget中向相同的URL写了类似的代码,运行正常但是浏览器中的相同代码永远不会返回结果.
我已经在SO上阅读了其他相同的原始策略主题,但我还没有看到任何与本地文件系统相关的解决方案.
我有一个网络应用程序(在一个松散的意义上)必须在本地服务.我试图在用户加载页面后加载大量数据,具体取决于他们在网页上做了什么.在Firefox 3.5和IE8中,我可以使用jQuery的AJAX()和GetScript()方法来执行此操作,但在Chrome中由于同源策略而失败.
XMLHttpRequest无法加载file://test/testdir/test.js.原产地null是不允许的by Access-Control-Allow-Origin.
这种情况发生在我做一些简单的事情时
$.getScript("test.js");
Run Code Online (Sandbox Code Playgroud)
这在IE和Firefox中运行良好.
在阅读了大量有关此内容之后,我决定尝试直接写入文档的头部.在Chrome的控制台中,我键入了以下内容:
var head = document.getElementsByTagName("head")[0];
var script =document.createElement('script');
script.id = 'uploadScript';
script.type = 'text/javascript';
script.src = "upload.js";
head.appendChild(script);
Run Code Online (Sandbox Code Playgroud)
这在粘贴到控制台中时工作正常 - <script...test.js</script>元素被添加到头部,评估,并且内容被加载到DOM中.
我认为这是成功的,直到我将此代码放入函数调用.从函数调用时,相同的确切代码会将元素添加到但不会评估JavaScript文件.我无法弄清楚为什么.如果我使用Chrome的控制台停止执行它正在添加元素的方法并运行上面的代码,它就不会对它进行评估.但是,如果我取消暂停执行并运行完全相同的代码(在控制台窗口中粘贴它),它就可以工作.我无法解释这一点.以前有人处理过这个吗?
我已经阅读了以下SO帖子,但他们没有描述我的问题:
绕过同源策略的方法
XMLHttpRequest Origin null不允许Access-Control-Allow-Origin for file:///到file:///(无服务器)
跨站点XMLHttpRequest
同样,我最后的办法是在网页加载时加载所有数据 - 这可能导致加载网页最多延迟10秒,这对90%的应用用户来说是不必要的.
感谢您的任何建议/选择!
我想将请求参数发送到其他域
我已经知道Cross Scripting需要JsonP,我已经将JsonP与Jquery ajax一起使用了
但我不知道如何使用XMLHttpRequest进行Cross Scripting
下面的代码我的基本XMLHttpRequest代码.
我想我需要chage xhr.setRequestHeader(),我必须添加解析代码
请给我任何想法
var xhr;
function createXMLHttpRequest(){
if(window.AtiveXObject){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}else{
xhr = new XMLHttpRequest();
}
var url = "http://www.helloword.com";
}
function openRequest(){
createXMLHttpRequest();
xhr.onreadystatechange = getdata;
xhr.open("POST",url,true);
xhr.setRequestHeader("Content-Type",'application/x-www-form-urlencoded');
xhr.send(data);
}
function getdata(){
if(xhr.readyState==4){
if(xhr.status==200){
var txt = xhr.responseText;
alert(txt);
}
}
}
Run Code Online (Sandbox Code Playgroud) 根据jQuery:
crossDomain (default: false for same-domain requests, true for cross-domain requests)类型:Boolean如果要在同一域上强制执行crossDomain请求(例如JSONP),请将crossDomain的值设置为true.例如,这允许服务器端重定向到另一个域.(版本增加:1.5)
我不明白以上.
如果代码是
$(document).ready(function ()
{
$.ajax(
{
url: 'http://es3.com/Handlers/MyHandler.ashx',
cache: false,
dataType: "jsonp",
...
...
});
});
function aaa(json)
{
alert(json.result);
}
Run Code Online (Sandbox Code Playgroud)
并且即时通讯指定datatype:jsonp,然后响应将是application/javascript mime typed,因为它是一个将在我的浏览器中运行的脚本.
当我在同一个域下运行此代码时,我没有看到为什么它不会像那样行为的任何原因.(因此 - 我没有看到这个属性的用法).
我做了一个样本
我有2个(主机调整)域名.es2.com和es3.com.
(注意,代码中的url始终是es3.com)
测试#1:
从es3.com以下位置运行代码:(左窗格)从以下位置
运行代码es2.com:(右窗格)
crossDomain:false(缺少时默认).
看看差异:(http://i.stack.imgur.com/RKyZp.jpg)
测试#2:
运行以下代码es3.com:(左窗格)
运行以下代码es2.com:(右窗格)
crossDomain:true <---通知
(http://i.stack.imgur.com/xEcyd.jpg)

我没有看到任何区别. …
我知道如果在我自己的网页上,如果我的用户在:http:
//www.example.com/form.php
我从该页面发出ajax请求:http:
//example.com/responder.php
由于相同的原始策略(子域不同),它将失败.
我想要了解的是,当请求和服务器明显不同时,AJAX请求如何从API中提取数据,如flickr.
编辑:
例如:为什么这段代码有效?
$.getJSON('http://api.flickr.com/services/rest/?&;method=flickr...'
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有两个VS项目:一个暴露MVC5控制器,另一个是角客户端.我希望angular客户端能够查询控制器.我阅读了很多线程并尝试了以下内容:
我在服务器的web配置中添加了这个:
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
<system.webServer>
Run Code Online (Sandbox Code Playgroud)我在控制器的动作上创建并使用了以下过滤器:
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)在angular客户端中,我创建了以下拦截器:
app.factory("CORSInterceptor", [
function()
{
return {
request: function(config)
{
config.headers["Access-Control-Allow-Origin"] = "*";
config.headers["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS";
config.headers["Access-Control-Allow-Headers"] = "Content-Type";
config.headers["Access-Control-Request-Headers"] = "X-Requested-With, accept, content-type";
return config;
}
};
}
]);
app.config(["$httpProvider", function ($httpProvider) {
$httpProvider.interceptors.push("CORSInterceptor");
}]);
Run Code Online (Sandbox Code Playgroud)根据Firebug,这导致以下请求:
OPTIONS //Login/Connect HTTP/1.1
Host: localhost:49815
User-Agent: Mozilla/5.0 (Windows NT …Run Code Online (Sandbox Code Playgroud) 我想检索以下网站正文内容http://sports.espn.go.com/nhl/bottomline/scores?nhl_s_left1并将其存储在一个字符串中,我知道并且成功使用php检索此内容,但我想要限制只使用javascript,有没有办法只是在网站中取出字符串并将其复制并存储在var中?
我正在通过XHR访问的azure上存储json blob.在尝试加载这些blob时,我收到此错误:
XMLHttpRequest无法加载http://myazureaccount.blob.core.windows.net/myjsoncontainer/myblob.json?json.Access-Control-Allow-Origin不允许使用origin http:// localhost.
有没有办法设置azure返回的blob 的Access-Control-Allow-Origin标头?
我有一个http://网站需要访问在https://网站上公开的第三方JSON API .我已经阅读了通过方法来规避同源策略,但似乎那里描述的方法不适合我:
是这个吗?我必须实施解决方案4,这似乎相当复杂,或者我错过了什么?
javascript ×8
ajax ×5
cors ×2
jquery ×2
angularjs ×1
asp.net-mvc ×1
cookies ×1
jsonp ×1
preflight ×1
web-services ×1