我有一个通过 HTTP 提供的网站,在Heroku上有一个自定义域(例如 mywebsite.com) 。
当用户想要登录时,我通过 HTTPS 将他们重定向到我的 Heroku 应用程序的非自定义 URL(使用Piggyback SSL,因为我很便宜并且不想为SSL Endpoint付费)。
然后,在他们登录后,我将用户重定向回我的自定义域,因为他们的流量不再需要加密。
唯一的问题是,在重定向它们之前,我使用flash[:notice]
(with sinatra-flash ) 显示一条消息(例如,“您已成功登录!” )。但我相信,由于用户在此过程中从一个域跨越到另一个域,尽管仍在同一台服务器上,但他们看不到该消息,因为无法从域 Y 访问来自域 X 的会话数据。
- 我对问题的理解正确吗?
- 修复它的正确方法是什么?
2012-10-12 更新:
所以,我最终采用的解决方案有点老套:
首先,我添加了一个新的数据模型,OneTimeFlash
其中token
包含一个包含每个记录的随机字符串的字段。然后我做了它,以便在用户登录域 X 后,我创建一个新OneTimeFlash
实例并使用查询字符串中的令牌重定向到域 Y:
# The model automatically generates a token before being created.
one_time_flash = OneTimeFlash.create(:message => "You've successfully logged in!")
redirect "#{DOMAIN_Y}/flash/#{one_time_flash.token}"
然后当服务器在请求中检测到这个令牌时,它会显示 flash:
get "/flash/:token" do |token|
one_time_flash = OneTimeFlash.first(:token => token)
flash[:notice] = one_time_flash.message unless one_time_flash.nil?
one_time_flash.destroy
redirect "/
end
(ORM 是DataMapper,以防有人感到困惑。)
就像我说的:它很hacky,但它有效。谁能想到这种方法有什么严重的问题?