我使用Sinatra作为web服务和angularjs来进行调用
post '/loginUser' do
session[:cui]=user['cui']
end
get '/cui' do
return session[:cui].to_s
end
但它似乎不起作用('/ cui'调用返回一个空字符串)任何帮助都会大大降低。
更新: 在sinatra header中设置这个['Access-Control-Allow-Credentials'] ='true'允许我发送会话,但好像$ http指令没有使用浏览器cookie
答案 0 :(得分:2)
在sinatra app上
before do
headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
headers['Access-Control-Allow-Origin'] = 'http://localhost:4567'
headers['Access-Control-Allow-Headers'] = 'accept, authorization, origin'
headers['Access-Control-Allow-Credentials'] = 'true'
end
angularjs app
host='http://127.0.0.1:5445/'
@viewController = ($scope,$http)->
$scope.getCui = ()->
$http.get(host+'cui',{ withCredentials: true}).success (data)->
$scope.cui=data
console.log data
说明: AngularJS使用自己的cookie系统,因此我们需要指定我们可以使用{withCredentials:true}配置对象通过$ http.get调用传递cookie。 Sinatra需要接受跨域cookie,因此我们需要上面提到的标题。 注意:' Access-Control-Allow-Origin'标头不能是通配符。
答案 1 :(得分:1)
围绕此选项的一个选项是使用代理传递配置http服务器,因此您可以在不产生交叉原始错误的情况下命中同一个域。这样,您可以继续将您的抽象维护为2个独立的应用程序。
以下是nginx的简要示例:
upstream angular_app {
server localhost:3003;
}
upstream sinatra_app {
server localhost:3004;
}
server {
listen 80;
server_name local.angular_app.com;
root /Users/username/source/angular_app/;
location / {
proxy_set_header Host $http_host;
proxy_redirect off;
}
location ~ ^/api/(.*)$ {
proxy_set_header Host $http_host;
proxy_read_timeout 1200;
proxy_pass http://sinatra_app/;
}
}
通过在服务器级别进行路由,您可以成功绕过域限制,并且可以将应用程序分开。