如何跨域使用flash [:notice]?

时间:2012-10-09 20:35:14

标签: session heroku sinatra

我的网站通过HTTP在Heroku上提供自定义域名(例如mywebsite.com)。

当用户想要登录时,我会通过HTTPS将其重定向到我的Heroku应用程序的非自定义网址(使用Piggyback SSL,因为我很便宜并且不想支付SSL Endpoint)。

然后,在他们登录后,我将用户重定向回我的自定义域,因为他们的流量不再需要加密。

唯一的问题是,在重定向之前,我会使用flash[:notice]sinatra-flash)显示一条消息(例如,“您已成功登录!”)。但我相信,由于用户在此过程中从一个域跨越到另一个域,但仍然在同一台服务器上,他们看不到该消息,因为域X中的会话数据无法从域Y访问。

  • 我对问题的理解是否正确?
  • 修复它的正确方法是什么?

2012-10-12更新

所以,我最终选择的解决方案是有点hacky:

首先,我添加了一个新的数据模型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,但它确实有效。任何人都可以想到这种方法的任何严重问题吗?

1 个答案:

答案 0 :(得分:0)

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

您可以使用HTML5 localstorage - some random localstorage explanationw3schools website on html5 localstorage

相关问题