【问题标题】:How can I use flash[:notice] across domains?如何跨域使用 flash[:notice]?
【发布时间】: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:因为我想不出更好的方法!可以吗?

标签: session heroku sinatra


【解决方案1】:

在这种情况下,您不能在域之间使用 flash,因为 flash 只为下一个请求保存。

您可以使用 HTML5 本地存储 - some random localstorage explanationw3schools website on html5 localstorage

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多