我是phonegap的新手。我想在phonegap中运行一个AngularJs应用程序。在服务器端我使用Apache tomcat 7 CORS过滤器和Rest。当我从浏览器运行应用程序时它工作正常。但是目前我在ios或android中使用phonegap运行应用程序,GET请求正常,但是post请求提供了403 Forbidden响应。我可以在请求“Origin”标题内部看到file://。我认为问题出在这里。
我的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都有
添加了<access origin="*" />
行。
通过在app.js中添加以下行,还可以在angular.js中启用CORS:
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
如果之前有人遇到过此问题,请帮我解决。
答案 0 :(得分:2)
是的,您需要做的就是在config.xml文件中添加以下行:
<access origin="http://example.com" />
你也可以这样做:
<access origin="*" />
但指定您发送请求的域名更安全。
如果您需要更多信息,请在PhoneGap文档中查看此page。
答案 1 :(得分:1)
Taher的解决方案通过PhoneGap + jQuery访问tomcat web服务解决了我的问题。 只是在我的项目中包含了引用的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>
答案 2 :(得分:0)
我更改了服务器中的tomcat过滤器。 我在自定义过滤器中修改了请求的Origin标头,它可以工作。我不知道这是正确的做事方式,但我这是让它运作的唯一方法。
答案 3 :(得分:0)
下面给出的是Tomcat CORS过滤器中的代码,所以新的URI使用Origin作为&#34; file://&#34;抛出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