Печенье Синатры исчезает на определенных маршрутах? - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть простое приложение 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

Если я зайду вcookie / установить его правильно, устанавливает cookie (можно увидеть в firecookie), затем, если я перехожу к cookie / get, я получаю правильный вывод cookie.Однако, если я захожу в / secret, он всегда перенаправляется в / login.Поскольку я все еще плохо знаком с синтаксисом Ruby, я подумал, что это может быть проблема с моим состоянием в расширении authenticate, поэтому я попытался удалить его и просто выплевывать cookie, как это делает другой.Тем не менее, все еще ничего, так что я в растерянности относительно того, почему там cookie, я вижу его в браузере ... и / cookies / get работает, но / secret не ...

Я что-то здесь упускаю?

1 Ответ

5 голосов
/ 18 ноября 2011

Проблема в том, что для cookie задан путь /cookie. Когда вы устанавливаете cookie, вы можете указать путь, который фактически является частью веб-сайта, к которому вы хотите применить cookie. Я предполагаю, что Sinatra / Rack по умолчанию использует путь текущего запроса, который в /cookie/set будет /cookie.

Вы можете заставить его работать так, как вы ожидаете, явно указав путь:

  response.set_cookie("TestCookie", {
    :expires => Time.now + 2400,
    :value => "TestValue",
    :path => '/'
  })

Или вы можете установить cookie на маршруте с именем скажем /cookie-set вместо /cookie/set

...