CORS 问题 (IONIC 3)

Posted

技术标签:

【中文标题】CORS 问题 (IONIC 3)【英文标题】:CORS Issues (IONIC 3) 【发布时间】:2018-02-09 09:43:15 【问题描述】:

我正在尝试在 livereload 模式下处理 CORS 问题,但我无法找到合理的解决方案。我的后端是用 Java 开发的,它在 localhost 上运行。

命令:

ionic cordova 模拟 ios -l -c -s --address 127.0.0.1

ion.config.json:


  "name": "Smartmarket",
  "app_id": "",
  "type": "ionic-angular",
  "integrations": 
    "cordova": 
  ,
  "proxies": [
        "path": "/SmartmarketWeb/endpoint",
        "proxyUrl": "http://127.0.0.1:8080/SmartmarketWeb/endpoint"
  ]

请求示例:

let headers = new Headers( 
    'Content-Type': 'application/json'
);
let options = new RequestOptions( headers: headers );
return this.http.post('http://127.0.0.1:8080/SmartmarketWeb/endpoint/login', json, options)
    .timeout(TIMEOUT_REQUEST*1000)
    .map(this.extractData)
    .do(this.logResponse)
    .catch(this.handleError);

错误:

有人可以帮帮我吗?我尝试了许多解决方案,但是,它们都没有效果。

【问题讨论】:

应该指定 CORS 标头的是您的服务器端而不是您的客户端 @Liam 谢谢你的回答,但是不使用livereload模式(在IOS模拟器和真机中)如何正常工作? @Liam 指出客户端不是指定 CORS 标头的地方。所以你需要从你的请求代码中删除'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Credentials': true, 'Access-Control-Allow-Headers': 'origin, content-type, accept'。在你的前端 javascript 代码中添加这些不会有任何影响,只会进一步破坏事情 你是对的,我在服务器端应用了解决方案,它确实有效。 【参考方案1】:

仅解决方法 - 不是完美的解决方案


我运行时遇到了同样的问题,我的 ionic 3 应用程序与 ASP.net 后端运行得很好,它不能与 IOS 一起使用(Iphone x - IoS 11 模拟器)。

解决方案

我更改了我的 ionic 应用程序的 web view 选项。

首先,打开 config.xml 并添加以下属性

<feature name="CDVWKWebViewEngine"> <param name="ios-package" value="CDVWKWebViewEngine" /> </feature> <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />

然后删除所有插件和平台,然后运行或构建您的应用程序

this url中给出的详细步骤

【讨论】:

这是推荐的解决方案。使用原生插件【参考方案2】:

问题出在服务器端。遵循以下解决方案(Java - Jersey 2):

过滤器类:

@Provider
public class CORSResponseFilter implements ContainerResponseFilter 

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException 

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");    
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");          
        headers.add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        headers.add("Access-Control-Allow-Credentials", "true");


    


web.xml:

<servlet>
    <servlet-name>Endpoint</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.smartmarket.endpoint</param-value>
    </init-param>
    <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>com.smartmarket.filter.CORSResponseFilter</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

【讨论】:

【参考方案3】:

最佳解决方案:

选项 1)

对于离子 v2 或 v3 : https://ionicframework.com/docs/v3/native/http/

对于cordova/phonegap: https://github.com/silkimen/cordova-plugin-advanced-http

选项 2)

在服务器上启用 CORS。

【讨论】:

以上是关于CORS 问题 (IONIC 3)的主要内容,如果未能解决你的问题,请参考以下文章

CORS Ionic 3 发布请求

在 ionic 4 上使用 Angular 7 帖子时出现 Cors 策略错误

移动设备上的 Ionic 4 CORS 问题

如何解决 Ionic2 中的 CORS 问题和 JSONP 问题

Ionic CLI 6.13.0 上的 CORS 问题

本地主机和设备上的 Ionic 的 CORS 问题[关闭]