【问题标题】:Rails Action Cable: How to fetch User Agent & Client IP Address?Rails Action Cable:如何获取用户代理和客户端 IP 地址?
【发布时间】:2019-03-15 00:17:58
【问题描述】:

我正在升级 Rails 应用程序以通过 Action Cable 使用 websocket。出于记录目的,我需要获取客户端的 IP 地址和发送套接字消息的用户代理。

MyChannel 类(app/channels/my_channel.rb)的speak 方法中,我无法访问会话或请求。

您对我如何在此speak 方法中获取user_agent 和客户端IP 地址有任何想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 actioncable


    【解决方案1】:

    要使用remote_ip 助手,您可以在您的频道中执行此操作:

    ActionDispatch::Request.new(connection.env).remote_ip
    

    【讨论】:

      【解决方案2】:

      ActionCable::Connection::Base 包含有关当前连接环境的所有信息(HTTP 标头、机架进程等),您可以通过其env 属性阅读器访问它。

      例如,以下是我如何获取在建立 WebSocket 连接时使用的 User-Agent HTTP 标头:

      user_agent = connection.env["HTTP_USER_AGENT"]
      

      请注意,我从ApplicationCable::Channel 实例运行此代码,其中连接实例可通过connection 属性获得

      我找不到任何关于它的文档,但我相信它是安全的,因为 env 属性已公开可用 (https://api.rubyonrails.org/v5.1.6/classes/ActionCable/Connection/Base.html#method-i-request)。您可以通过在控制台中运行connection.env.keys 来获取此哈希包含的键的完整列表(显然,当connection 实例可用时)。

      【讨论】:

        【解决方案3】:

        您可以从 Channel 所属的 Connection 对象中的请求中获取此信息。

        【讨论】:

        • Hi Xnust.. 你能详细说明我如何在 Channel -> speak 方法中访问 Connection 对象吗?
        • 嗨。在您的连接中,您可以添加 f.e. attr_accessor :ip_addr,并在连接方法中设置它的值(@ip_addr = request.remote_ip)。在 Channel 中通过 self.connection.ip_addr 获取
        猜你喜欢
        • 2011-05-26
        • 2019-01-16
        • 1970-01-01
        • 2013-11-09
        • 2012-03-14
        • 2012-02-16
        • 2019-01-14
        • 2014-12-29
        • 2013-07-10
        相关资源
        最近更新 更多