【问题标题】:Sencha Touch Ajax Request Error: Origin null is not allowed by Access-Control-Allow-Origin.Sencha Touch Ajax 请求错误:Access-Control-Allow-Origin 不允许 Origin null。
【发布时间】:2013-05-16 23:02:06
【问题描述】:

我正在向远程服务器发出 Ajax 请求并将参数作为 POST 方法发送。 但我收到以下回复:

**"MLHttpRequest cannot load http://rasovai.com/mobilecontact1.php?_dc=1369189135731. Origin null is not allowed by Access-Control-Allow-Origin.  "**

我读到了这个错误,发现是因为CORS,所以我在请求中添加了header,如下所示:

 Ext.Ajax.defaultHeaders = {
                                        'Accept': 'application/json',
                                        'Accept': 'Access-Control-Allow-Origin: *',
                                        'Accept': 'Access-Control-Allow-Credentials:   true',
                                          'Accept': 'Access-Control-Allow-Methods: OPTIONS, GET, POST',
                                        'Accept': 'Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control'
                                    };

但我仍然收到相同的响应错误。

我可以点击服务器上的 url,但无法传递参数。

谁能在这方面帮助我?

谢谢 伊山耆那教

【问题讨论】:

    标签: ajax jquery xmlhttprequest sencha-touch cors


    【解决方案1】:

    这些标头需要由服务器而不是客户端发送。

    【讨论】:

    • 非常感谢。是否有任何其他解决方法,我可以在客户端进行,这样我就不需要在服务器上进行更改。实际上我对服务器没有经验,所以你能告诉我如何在服务器端进行更改以使其正常工作。
    • 您无法在客户端做很多事情来绕过 CORS。要启用这些标头服务器端,请查看:enable-cors.org/server.html
    • 你认为json代理可以帮助跨域请求吗?
    • 当然。如果您能够在运行脚本的同一域上托管代理,则可以解决 CORS 问题。
    【解决方案2】:

    如果您使用 Chrome 浏览器,您可以使用 --disable-web-security 标志来允许跨域请求,如果您将其构建到应用程序中,这将正常工作。请查看此线程以获取更多详细信息:How to use json proxy to access remote services during development

    【讨论】:

    • 我在这里看到的一个问题是,禁用网络安全仅在开发期间有效,但是当您在设备上测试此功能时,它会再次引发相同的 CORS 问题。
    • 我在我的 iPad 应用程序中使用 AJAX(不是 JSONP)代理,它工作正常,没有任何错误。看起来桌面浏览器和移动 webview 有不同的安全策略。
    • 请看一下这个问题:stackoverflow.com/questions/16767351/…
    【解决方案3】:

    如果你想将参数传递给服务器,那么你可以这样做。

     Ext.Ajax.request({
                url : serverURL,
                jsonData : requestParams,  //  Object which encapsulates the request params
                method : 'POST',
                withCredentials: true,
                useDefaultXhrHeader: false,
    
               // List of header params can be sent as follows
                headers : {
                    "Content-Type" : "application/json",
                    "Accept" : "application/json",
                    "Access-Control-Allow-Origin":"http://localhost:8080",
                    "Authorization":auth
                },
    
                username : 'mobiliser',
                password : 'secret',
                success : function(response) {
                 }
                failure : function ()
                 {
                 }
    

    正如您在问题中所说,服务器位于不同的域中,您可能必须使用 JSONP 请求。

    如果您有任何问题,请告诉我。

    谢谢- 热血

    【讨论】:

    • 同样,Access-Control 标头需要由服务器而不是客户端发送。从客户端发送时,它们绝对不做任何事情。
    • 如果您的 sencha 应用程序由于跨域问题而无法直接与远程服务器通信,则在客户端创建一个 servlet 并将其放置在与您的 sencha 应用程序相同的服务器上。您的 sencha 应用程序将与 servlet 通信,而 servlet 将与远程服务器通信。这是解决 CORS 问题的一种解决方法。
    • 感谢 gys 的帮助。是的,我认为 idbehold 也是正确的。嘿 Gendaful 我可以将 php 脚本文件放在本地服务器上并将参数发送到 php 文件,然后 PHP 脚本将发送电子邮件。你能这样指导我吗?请看看这个问题“stackoverflow.com/questions/16657005/…
    • 您好 Gendaful,实际上我的 php 脚本无法正常工作,您能帮我使用 servlet 发送邮件吗?
    • 嗨 Ishant,我很乐意提供帮助,但我现在无法访问 servlet 代码。但让我告诉你,这将是一个简单的 servlet,它与你的远程服务器对话并发送请求并获取响应并将响应数据传递给你的 sencha 应用程序。你的 sencha 应用程序将使用 Ext.Ajax 调用这个 servlet因为 sencha 应用程序和 servlet 位于同一个域中。希望对您有所帮助。
    猜你喜欢
    • 2012-06-07
    相关资源
    最近更新 更多