【问题标题】:How to use Rack middleware to simultaneously set cookie and send response with cookie in effect如何使用 Rack 中间件同时设置 cookie 并发送有效的 cookie 响应
【发布时间】:2013-07-04 02:44:51
【问题描述】:

我正在尝试使用 Rack Middleware 设置一个 cookie 并在相同的请求-响应周期中发送一个有效 cookie 的响应。

这里是上下文:我正在开发一个具有两种模式的网站:美国模式和英国模式(不同的徽标、导航栏、样式等)。当英国访问者第一次访问该页面时,我想在他的浏览器上设置一个“英国模式”cookie,但同时也呈现英国版本的页面。到目前为止,这是我的代码:

 # middleware/geo_filter_middleware.rb

 def initialize(app)
   @app = app
 end

 def call(env)
   status, headers, body = @app.call(env)
   response = Rack::Response.new(body, status, headers)
   if from_uk?(env)
      response.set_cookie('country', 'UK')
   end
   response.to_a
 end

当英国访问者首次访问该页面时,它会在其 Cookie 中设置“英国模式”,但仍会呈现默认的美国版本页面。只有在第二次请求之后,cookie 才会生效并且英国访问者会看到英国模式。

有没有人知道在一个请求-响应周期中同时设置 cookie 并返回一个有效 cookie 的响应?

【问题讨论】:

    标签: ruby-on-rails rack rack-middleware


    【解决方案1】:

    您需要在 application.rb 中设置中间件

    config.middleware.insert_before "ActionDispatch::Cookies", "GeoFilterMiddleware"
    

    在你的中间件中做这样的事情:

      def call(env)
        status, headers, body = @app.call(env)
        if from_uk?(env)
          Rack::Utils.set_cookie_header!(headers, 'country', { :value => 'UK', :path => '/'})
        end
        [status, headers, body]
      end
    

    【讨论】:

    • 嘿,这看起来很有希望。感谢您的回答!
    • 这看起来很有希望,但它不起作用。它与问题中的现有代码具有相同的效果 - 设置了 cookie,但不是针对同一个请求。任何可行的方法都必须在执行 @app.call(env) 之前修改环境
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2017-03-06
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多