【问题标题】:Tomcat Cors + Oracle ORDS is blocking my angular requestTomcat Cors + Oracle ORDS 阻止了我的角度请求
【发布时间】:2020-02-29 15:54:45
【问题描述】:

我有一个 Angular 客户端,它应该从 Oracle Rest 数据服务中获取数据。 ORDS 在处理身份验证的 tomcat 中运行。

如果我使用 curl 执行请求,它会起作用。我有一个 c# webapi,我编写了一个控制器来从 ORDS => 获取数据也可以工作。 所以我的 Angular 客户端从 c# webapi => ORDS 接收数据,但不直接从 ORDS 接收数据。

login(username, password) {
    let b64 = btoa(username + ':' + password);
    localStorage.setItem('currentUser', b64);
    let headers = new HttpHeaders();
    headers = headers.append('Accept', 'application/json');
    headers = headers.append('Authorization', 'Basic ' + b64);
    return this.http.get<any>(`URL to ORDS`, {headers} ).subscribe(result => {
      console.log(JSON.stringify(result));
    });
  }

我的 tomcat web.xml:

<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>http://localhost:4200/</param-value>
      </init-param> 
      <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>*</param-value>
      </init-param> 
      <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>*</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>

服务器返回的那一刻

Access to XMLHttpRequest at 'URL to ORDS' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

【问题讨论】:

    标签: angular oracle cors tomcat9 oracle-ords


    【解决方案1】:

    您可以使用 ORDS 包 API 设置允许的来源列表

    BEGIN
           ORDS.SET_MODULE_ORIGINS_ALLOWED(
                  P_MODULE_NAME       => 'test',
                  P_ORIGINS_ALLOWED   => 'www.thatjeffsmith.com'
           );
    END;
    /
    

    当我使用正确的 Origin 标头向我的测试模块发出请求时,我的响应表明它已被允许

    如果我的请求标头表明我来自不允许的地方...

    可能就这么简单,但通常还有很多事情要做。当我们得到HAR(网络请求日志)时,最容易调试

    【讨论】:

    • 我尝试了您的解决方案,但仍然无法正常工作。这是我的 .har 文件的链接:cs.myasp.eu/portal/s/155301230701720273631.har
    • @KnApP993 该日志在 HEAD 请求上只有 401,看不到任何 cors 问题或 ords 资源...
    • 到目前为止我已经解决了我的问题。如果我用 --disable-web-security 启动 chrome,cors 问题就会消失。这对我的生产环境意味着什么?是否可以在客户端更改该行为?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-10-18
    • 2020-08-16
    • 2022-11-01
    • 2021-03-20
    • 2021-06-18
    • 2012-12-06
    相关资源
    最近更新 更多