首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular CORS请求被阻塞

问Angular CORS请求被阻塞
EN

Stack Overflow用户
提问于 2018-05-09 00:02:18
回答 6查看 105.4K关注 0票数 16

我正在尝试将我的Angular应用程序与express上的一个简单的REST服务器连接起来。服务器只发送json数据作为对请求的回复。为了添加CORS支持,我使用了npm中的cors模块。在Angular应用程序上,我按照这个问题的说明添加了HttpHeaders:Angular CORS request blocked。

下面是我在express中设置cors选项的代码:

代码语言:javascript
复制
// async CORS setup delegation
function corsOptsDelegator(req, cb) {
    let opts = {},
        origin = req.header('Origin');
    if(imports.allowedOrigins.indexOf(origin) === 1) opts.origin = true;
    else opts.origin = false;
    opts.optionsSuccessStatus = 200;
    opts.methods = ['POST', 'GET']; // allowed methods
    opts.credentials = true; // for passing/setting cookie 
    opts.allowedHeaders = ['Content-Type', 'Accept', 'Access-Control-Allow-Origin']; // restrict headers 
    opts.exposedHeaders = ['Accept', 'Content-Type']; // for exposing custom headers to clients; use for hash
    cb(null, opts);
}
`

下面是我如何将它添加到全局get处理程序中:

代码语言:javascript
复制
`
app.get('/', cors(corsOptsDelegator), (res, req, nxt) => {
    // only for adding cors on all requests
    nxt();
});
`

下面是我如何设置Angular服务的:

`

代码语言:javascript
复制
export class ContentGetterService {

  private root: string;
  private corsHeaders: HttpHeaders;
  //private contents: string;

  constructor(private http: HttpClient) {
    this.root = 'http://localhost:8888';
    this.corsHeaders = new HttpHeaders({
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Access-Control-Allow-Origin': 'http://localhost:4200'
    });
    //this.contents = '';
   }

  getContent(subs: Array<string>): Observable<IContent> {
    return (() => {
      return this.http.get<IContent>( (() => {
        let r = this.root;
        subs.forEach((s, i, a) => {
          if(i === a.length-1) {
            r += s;
          }
          else {
            if(s !== '/') {
              r += s;
            }
          }
        });
        return r;
      })(), {
        headers: this.corsHeaders
      });

    })();
  }
  }

浏览器警告:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8888/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

谢谢。

EN

回答 6

Stack Overflow用户

发布于 2018-05-09 00:06:01

如果您使用的是angular-cli,则可以使用代理:

proxy.conf.json

代码语言:javascript
复制
{
  "/api": {
    "target": "http://localhost:8888",
    "secure": false
  }
}

将所有带有/api前缀的请求重定向到localhost:8888,没有任何cors问题。

官方文档:https://angular.io/guide/build#proxying-to-a-backend-server

票数 12
EN

Stack Overflow用户

发布于 2018-05-09 05:40:23

首先,客户端上的问题是由于Firefox选择处理飞行前CORS的行为。用OPTIONS方法代替了GET方法。从我的代码中可以明显看出,我没有任何处理OPTIONS的处理程序。在谷歌搜索之后,我在github上发现了这个帖子:Express CORS middleware。使用它并对我的客户端请求头进行以下修改,我就能够正确地启动并运行它。代码如下:

CORS中间件:

代码语言:javascript
复制
function myCors(req, res, nxt) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:4200');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Origin, Content-Type, Accept, Accept-Language, Origin, User-Agent');
    if(req.method === 'OPTIONS') {
        res.sendStatus(204);
    }
    else {
        nxt();
    }
}`

挂载到app实例:app.use(myCors);

在Angular客户端服务上:

代码语言:javascript
复制
this.corsHeaders = new HttpHeaders({
  'Content-Type': 'application/json',
});
// ... adding it to the request
getContent(subs: Array<string>): Observable<IContent> {
return (() => {
  return this.http.get<IContent>( (() => {
    let r = this.root;
    subs.forEach((s, i, a) => {
      if(i === a.length-1) {
        r += s;
      }
      else {
        if(s !== '/') {
          r += s;
        }
      }
    });
    return r;
  })(), {
    headers: this.corsHeaders
  });
 
})();
}

感谢大家的时间和努力。

编辑

感谢@neutrino指出,在请求中添加Access-Control-*头没有任何意义(也没有任何效果)。

票数 7
EN

Stack Overflow用户

发布于 2019-02-20 04:27:33

在开发环境(本地主机)中,你可以很容易地做到这一点,而不需要遵循任何这些硬steps.You可以简单地下载https://addons.mozilla.org/firefox/addon/cors-everywhere/如果你正在使用火狐,我认为肯定有一个扩展为chrome also.After下载它会来到火狐菜单栏,然后你可以点击它来激活它,这就是你现在可以访问的所有apis,因为它自动发送与所有requests.For生产环境的头你必须从你的服务器配置它添加访问控制-允许-起源到*(所有)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50237881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档