我有一个简单的Sinatra应用程序,我正在玩,由于某种原因,cookie似乎不适用于某些路线,我发现这很奇怪。
require "sinatra"
set(:authenticate) do |*vars|
condition do
unless request.cookies.has_key?("TestCookie")
redirect to("/login"), 303
end
end
end
get "/login" do
return "No valid cookie"
end
get "/secret", :authenticate => [:auth_cookie] do
cookie = request.cookies["TestCookie"]
return "Secrets ahoy - #{cookie}"
end
get '/cookie/set' do
response.set_cookie("TestCookie", {
:expires => Time.now + 2400,
:value => "TestValue"
})
return "Cookie is set"
end
get '/cookie/get' do
cookie = request.cookies["TestCookie"]
return "Cookie with value #{cookie}"
end
如果我去cookies /设置它正确设置cookie(可以在firecookie中看到它),那么如果我去cookies /得到我得到正确的cookie输出。但是,如果我去/ secret它总是重定向到/ login。由于我仍然是Ruby语法的新手,我认为这可能是我的条件在authenticate扩展中的问题,所以我尝试删除它并像其他人一样吐出cookie。但仍然没有,所以我不知道为什么cookie在那里,我可以在浏览器中看到...和/ cookies / get工作,但/ secret不...
我在这里错过了什么吗?
答案 0 :(得分:5)
问题是cookie是使用路径/cookie
设置的。当您设置cookie时,您可以指定路径,该路径实际上是您希望cookie应用于网站的子部分。我猜Sinatra / Rack默认使用当前请求的路径,/cookie/set
中的路径为/cookie
。
您可以通过明确指定路径使其按预期方式工作:
response.set_cookie("TestCookie", {
:expires => Time.now + 2400,
:value => "TestValue",
:path => '/'
})
或者您可以在名为/cookie-set
而不是/cookie/set
的路线上设置Cookie