Ruby on rails Angular2应用程序至Rails5后端的CORS问题
从我记事起,我就一直在与CORS抗争,但我正在尝试一件非常简单的事情:C9上的3个微服务-所有3个不同端口,所以不是同一起源 在Rails中:Ruby on rails Angular2应用程序至Rails5后端的CORS问题,ruby-on-rails,angularjs,cors,ruby-on-rails-5,Ruby On Rails,Angularjs,Cors,Ruby On Rails 5,从我记事起,我就一直在与CORS抗争,但我正在尝试一件非常简单的事情:C9上的3个微服务-所有3个不同端口,所以不是同一起源 在Rails中: 程序A-cors.rb-不工作 程序B-cors.rb有效 Angular2服务在这两个方面也非常相似(只更改名称),所以我只显示 程序即服务 import { Injectable } from '@angular/core' import { Http, Response, Headers, RequestOptions } from '@angul
程序A-cors.rb
-不工作
程序B-cors.rb
有效
Angular2服务在这两个方面也非常相似(只更改名称),所以我只显示
程序即服务
import { Injectable } from '@angular/core'
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { Document } from './document';
@Injectable()
export class DocumentService{
private documentsUrl = "//freeland-camp-documents-dnorthrup.c9users.io/freelance_documents.json";
constructor(
private http: Http
) {}
getDocuments(): Observable<Document[]> {
let headers = new Headers({ 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
let options = new RequestOptions({ headers: headers });
return this.http.get(this.documentsUrl)
.map((response: Response) => <Document[]>response.json())
.catch(this.handleError);
}
private handleError (error: Response | any) {
// In a real world app, we might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
在控制台中-好像Rails认为它成功发生了(我假设这是因为Rails处于API模式,JSON总是呈现
我到底遗漏了什么?程序B最初在那里有真实的源URL,但仍然有效,将其更改为*
并没有解决任何问题
根据我找到的Rails5文章,我还放置了:
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => 'freeland-camp-documents-dnorthrup.c9users.io:8082',
'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
在Application.rb中无效。欢迎任何见解-我没有主意。我尝试了Chrome的插件来绕过标题(无效),并使程序A
工作,但中断了程序B
说“origin evil.com不够用”。-当时我还没有*
欢迎任何意见。对于遇到此问题的人: 我可以通过修改来解决我的问题
config/application.rb
包括:
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
是正确的解决方案-似乎我有点缓存问题。
我没有使用*作为源代码,而是使用调用它的确切域
最后,我需要cors.rb
具有:
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
和application.rb
具有
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}