【发布时间】:2012-09-30 06:06:33
【问题描述】:
我在Heroku 上有一个使用自定义域(例如 mywebsite.com)通过 HTTP 提供服务的网站。
当用户想要登录时,我通过 HTTPS 将他们重定向到我的 Heroku 应用程序的非自定义 URL(使用 Piggyback SSL,因为我很便宜并且不想为 SSL Endpoint 付费)。
然后,在他们登录后,我将用户重定向回我的自定义域,因为他们的流量不再需要加密。
唯一的问题是,在重定向它们之前,我使用flash[:notice](带有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}"
那么当服务器在请求中检测到这个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,但它有效。谁能想到这种方法有什么严重的问题?
【问题讨论】:
-
为什么要将内容保存到数据库中只是为了给用户发送临时消息?
-
@RailsN00b:因为我想不出更好的方法!可以吗?