选项而不是发布:对预检请求的响应没有通过访问控制检查。

时间:2017-04-26 13:37:31

标签: angularjs rest http

我正在尝试访问一个rest api源,它正在使用邮递员或http请求者工作。我的代码出了什么问题?

let keyUrl ="yourUrl"

getAPIKey(){
   let headers = new Headers();
  //  headers.append('Content-Type', 'text/plain');
   headers.append('Authorization', 'Bearer ' + btoa(this.cred.user + ":" + this.cred.pw));
   headers.append('Access-Control-Allow-Methods', 'GET, POST, PUT');
   headers.append("Access-Control-Allow-Headers","*");

   let options = new RequestOptions({

     headers: headers,
     method: RequestMethod.Post,

    });

    return this.http.post(this.keyUrl,options)
        .map((res: Response) => {
          console.log('##############')
          console.log(res.json())
        })
        .catch(this.handleError)
        .subscribe(
        status => console.log(status),
        error => this.handleError(error),
        () => console.log('DONE')
        );


     }

我总是得到错误:

  

对预检请求的响应未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:4200'因此是不允许的   访问。

在我的后端,帖子请求为"选项"即使我发送了http.post。

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,我花了很长时间才找到合适的解决方案

您还必须在服务器端设置标头。他们基本上需要接受“OPTIONS” - 请求。

这可能取决于托管REST-API的服务器;如果你使用的是Apache-Server,你可以将它添加到你的httpd.conf中,它应该可以工作:

<Directory />
Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
             Header set Access-Control-Allow-Origin "jakartab3:16090, epbtesti:16090, localhost:16090"
             Header set Access-Control-Allow-Credentials "true"
             Header add Access-Control-Allow-Headers "Content-Type, Accept"
             Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"

或者,它也应该在您处理安全性的点上工作(如果这样做)。在这种情况下,设置HttpServletResponse的标题,如

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Origin-Methods", "GET, POST, OPTIONS");

希望这可以解决您的问题

编辑:试图解释为什么你需要设置它:

Access-Control-Allow-Origin阻止其他服务器访问您的REST服务 - 您的角度应用程序在它自己的服务器上运行,在端口4200上。为了使角度应用程序能够访问您的REST服务,正如我已经说过的,您需要根据我的回答在托管REST服务的服务器中设置标头;它无法在其他地方工作,因为此安全功能会阻止其他服务器访问您的REST服务