相关疑难解决方法(0)

来自移动WebView的CORS cookie凭证在本地加载了file://

跟我说,这个需要一些解释.

我正在帮助构建混合移动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: trueAccess-Control-Allow-Origin我们的Origin.

在这里,我们终于遇到了一个问题:使用file:// protocol加载网页时Origin,Web View发送的请求标头设置为null.因此无法由服务器解析,因此服务器无法将其设置为Access-Control-Allow-Origin.但是,如果服务器不能设置Access-Control-Allow-Origin到其他的东西比* …

javascript cookies ajax web-services cors

30
推荐指数
2
解决办法
1万
查看次数

从XMLHttpRequest清空responseText

我编写了一个运行良好的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写了类似的代码,运行正常但是浏览器中的相同代码永远不会返回结果.

javascript ajax xmlhttprequest

28
推荐指数
3
解决办法
10万
查看次数

绕过本地文件系统上的Chrome Access-control-allow-origin?

我已经在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%的应用用户来说是不必要的.

感谢您的任何建议/选择!

javascript jquery google-chrome same-origin-policy

28
推荐指数
1
解决办法
4万
查看次数

使用JsonP的JavaScript XMLHttpRequest

我想将请求参数发送到其他域

我已经知道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)

javascript ajax jsonp

27
推荐指数
1
解决办法
3万
查看次数

jQuery的ajax crossDomain属性的用法?

根据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.comes3.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) 在此输入图像描述

我没有看到任何区别. …

javascript ajax jquery

25
推荐指数
2
解决办法
2万
查看次数

同源策略 - AJAX和使用公共API

我知道如果在我自己的网页上,如果我的用户在: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)

(参考此社区Wiki)是否使用跨源资源共享

谢谢!

javascript ajax xmlhttprequest same-origin-policy

23
推荐指数
1
解决办法
1万
查看次数

在CORS预检频道的CORS标题"Access-Control-Allow-Headers"中缺少令牌"access-control-allow-headers"

我有两个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)

asp.net-mvc cors angularjs preflight

19
推荐指数
2
解决办法
5万
查看次数

仅使用javascript获取网站的body元素

我想检索以下网站正文内容http://sports.espn.go.com/nhl/bottomline/scores?nhl_s_left1并将其存储在一个字符串中,我知道并且成功使用php检索此内容,但我想要限制只使用javascript,有没有办法只是在网站中取出字符串并将其复制并存储在var中?

javascript

15
推荐指数
3
解决办法
2万
查看次数

以任何方式为windows azure blob设置access-control-allow-origin

我正在通过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标头?

azure-storage

14
推荐指数
1
解决办法
6040
查看次数

如何规避第三方https网站的同源政策?

我有一个http://网站需要访问在https://网站上公开的第三方JSON API .我已经阅读了通过方法来规避同源策略,但似乎那里描述的方法不适合我:

  1. document.domain方法 - 仅适用于子域.
  2. 跨源资源共享方法 - 需要服务器合作.
  3. window.postMessage方法 - 似乎需要打开一个弹出窗口?
  4. 反向代理方法 - 一种可能的解决方案,但似乎有点难以设置.
  5. http://anyorigin.com - 似乎不支持SSL.

是这个吗?我必须实施解决方案4,这似乎相当复杂,或者我错过了什么?

javascript same-origin-policy

14
推荐指数
1
解决办法
4955
查看次数