【问题标题】:Do phonegap support Cors?phonegap 支持 Cors 吗?
【发布时间】:2014-09-14 13:51:09
【问题描述】:

我是 phonegap 的新手。我正在尝试在 phonegap 中运行 AngularJs 应用程序。在服务器端,我使用 Apache tomcat 7 CORS 过滤器和 Rest。当我从浏览器运行应用程序时,它工作正常。但目前我在 ios 或 android 中使用 phonegap 运行应用程序,GET 请求工作正常,但 post 请求给出 403 Forbidden 响应。我可以在 file:// 的请求“Origin”标头值中看到。我认为问题出在这里。

我的tomcat Cors过滤器配置是:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>customer,user,Delay,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
    <init-param>
        <param-name>cors.support.credentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cors.preflight.maxage</param-name>
        <param-value>10</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这就是我从客户发出请求时得到的结果:

Request URL:http://134.0.12.789:8081/test/rest-api/testing/add
Request Method:PUT
Status Code:403 Forbidden
Request Headersview source
Accept:application/json, text/plain, */*
Content-Type:application/json;charset=UTF-8
customer:Xyz
Origin:file:// 
user:user1
User-Agent:Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36
Request Payloadview source
{quantity:0.5, unit:KG, product:5791}
quantity: 0.5
unit: "KG"
product: 5791
Response Headersview source
Content-Length:0
Content-Type:text/plain
Date:Wed, 23 Jul 2014 10:43:14 GMT
Server:Apache-Coyote/1.1

我的 www/config.xml 和 platform/android/res/xml/config.xml 也有 &lt;access origin="*" /&gt; 行添加到它。

在 angular.js 中也可以通过在 app.js 中添加以下行来启用 CORS:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

如果以前有人遇到过这个问题,请帮我解决这个问题。

【问题讨论】:

  • 我也有同样的问题。我检查了 /config.xml 和 /platforms/android/res/xml/config.xml,这两个文件都有 。还是不行。我的服务器访问日志报告: - - [25/Jul/2014:22:27:15 +0000] "PUT /service/route HTTP/1.1" 403 5 - - [25 /Jul/2014:22:34:45 +0000] "GET /service/some-route HTTP/1.1" 200 13 - - [25/Jul/2014:22:35:02 +0000] " POST /service/some-other-route HTTP/1.1" 403 5 - - [25/Jul/2014:22:36:24 +0000] "GET /service/another-route HTTP/1.1" 200第889章
  • 那么你做了什么来克服这个问题?有什么我在某处遗漏的东西吗?我花了很多时间让它工作,但似乎没有任何工作。
  • 当您的服务器响应 403 Forbidden 时,这似乎是服务器配置问题,请确保 url 可访问(如果您使用的是 apache+tomcat,可能检查 apache conf 文件?)。当您遇到 CORS 问题时,服务器会正​​常响应,但浏览器会阻止响应。
  • 不,我没有使用 apache+tomcat...我使用的是 tomcat。

标签: angularjs tomcat cordova cors


【解决方案1】:

是的,您所要做的就是在您的 config.xml 文件中添加这一行:

<access origin="http://example.com" />

你也可以这样做:

<access origin="*" />

但指定要向其发送请求的域会更安全。

如果您需要更多信息,请查看 PhoneGap 文档上的 page

【讨论】:

  • 我已经在platforms/andoid/config.xml 和phonegap 的www/config.xml 中添加了“” 行,但即使在那之后它也是一样的。
  • 另外,如果是 的问题,那么即使 GET 方法也不应该工作,因为它不会接受该来源,我会收到 404 错误。但是当 GET 有效但其他方法无效时,情况会更糟。我几乎尝试了所有可能的东西,但找不到任何有用的东西。
  • 问题一定不是来自Phonegap客户端,而是来自你的tomcat服务器配置。
【解决方案2】:

Taher 的解决方案解决了我使用 PhoneGap+jQuery 访问 tomcat 网络服务的问题。 刚刚在我的项目中包含了引用的 java 代码 (https://github.com/sebastienblanc/cors-filter/blob/master/src/main/java/org/ebaysf/web/cors/CORSFilter.java#L825),并将下一行添加到项目的 web.xml 中。重新部署它,就是这样。 (Tomcat 的 web.xml 中不需要 corsFilter。)现在它适用于 PhoneGap 请求和浏览器请求。这绝对是一些 TomCat(或 PhoneGap?)错误。

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>myDeploymentName.CORSFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
    <init-param>
        <param-name>cors.support.credentials</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

【讨论】:

    【解决方案3】:

    我更改了服务器中的 tomcat 过滤器。 我在自定义过滤器中修改了请求的 Origin 标头,它可以工作。我不知道这是否是做事的正确方法,但我这是让它工作的唯一方法。

    【讨论】:

    • 能否请您发布示例,您是如何修改它的?
    • 这是我必须在服务器上的过滤器中为 file:// 原始标头添加的解决方法: if (origin == null || origin.isEmpty() || origin.equalsIgnoreCase( "file://")) { request.addHeader("Origin", "localhost:9090"); }
    【解决方案4】:

    下面给出的是 Tomcat CORS 过滤器中的代码,因此 Origin 为“file://”的新 URI 会抛出 URISyntaxException 导致 403

    protected static boolean isValidOrigin(String origin) { URI originURI; try { originURI = new URI(origin); } catch (URISyntaxException e) { return false; } return originURI.getScheme() != null; }

    有人试图在以下链接中覆盖此过滤器。 https://github.com/sebastienblanc/cors-filter/blob/master/src/main/java/org/ebaysf/web/cors/CORSFilter.java#L825

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-06
      • 2013-12-30
      • 2015-06-16
      • 2017-06-03
      • 2012-07-21
      • 1970-01-01
      • 2016-09-03
      • 2013-11-09
      相关资源
      最近更新 更多