【问题标题】:How to get incoming IP address in Spray framework如何在 Spray 框架中获取传入的 IP 地址
【发布时间】:2013-09-27 02:00:42
【问题描述】:

我正在查看即将进入的标头,但那里似乎没有 IP:

HttpRequest(GET,http://127.0.0.1:8080/track/check,List(Accept-Language: uk-UA, 
uk, ru, en-US, en, Encoding: gzip, deflate, sdch, User-Agent: Mozilla/5.0 
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29
Safari/537.36, Accept: text/html, application/xhtml+xml, application/xml;q=0.9, 
*/*;q=0.8, Connection: keep-alive, Host: 127.0.0.1:8080),EmptyEntity,HTTP/1.1)

这是我从浏览器发出的请求。基本上我正在寻找:

path("check") {
       get {
         implicit request => {
           val a = 5
         }
       }
     } ~

这里的请求对象没有任何关于 IP 地址的信息。非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: http scala ip-address akka spray


    【解决方案1】:

    问题出在配置中,没有很好地记录。添加这个:

    # spray-can config
    spray.can {
      server {
        remote-address-header = on
      }
    }
    

    强制喷射将远程 IP 标头添加到主标头。地址标头将具有名称 Remote-Address。

    【讨论】:

    • 是的,你是对的,它目前的文档不足。一旦我们开始记录 clientIp 指令,它将完全包含该文档。抱歉,您必须找出困难的方法。
    • @jrudolph 仍然失踪。 spray.io/documentation/1.1.3/spray-routing/misc-directives/… 2 年,无压力。
    • @jrudolph 文档内容如何?我花了很多时间来得到这个答案,这是投票最多但未被接受的答案。
    【解决方案2】:

    如果您使用的是喷雾路由,那么有一个用于提取客户端 ip 的指令称为clientIP =) 要使用它,只需编写:

    (path("somepath") & get) {
      clientIP { ip =>
        complete(s"ip is $ip")
      }
    }
    

    更简单,但您仍然需要添加显式配置才能从请求中获取 IP。还有一点评论,也许我没有得到任何东西,但在喷雾中没有implicit request。实际上传入的请求会渗透到您的路由结构中,如果您查看路由库,您会发现该路由只是一个别名:type Route = RequestContext => Unit。因此,如果您需要在某些时候访问上下文,只需编写:

    (path("somepath") & get) {
      clientIP { ip => 
        reqCont => reqCont.complete(s"ip is $ip")
      }
    }
    

    但请记住静态路由部分和动态部分。

    【讨论】:

    • 这是一个好方法,但是我在下面的回答也非常相关。这实际上是我的主要问题。
    【解决方案3】:

    您需要 Alex K 和 4lex1v 发布的内容。

    以下配置强制喷雾将远程 IP 标头添加到主标头。地址标头将具有名称 Remote-Address。

    # spray-can config
    spray.can {
      server {
        remote-address-header = on
      }
    }
    

    然后您需要在路由周围添加clientIP 指令。

    (path("somepath") & get) {
      clientIP { ip =>
        complete(s"ip is $ip")
      }
    }
    

    这将返回一个 RemoteAddress 类型的对象,您可以从中提取 IP。

    remoteAddress.toOption.map(_.getHostAddress).getOrElse("Unknown")
    

    clientIP 指令将提取 IP(如果存在),但它提取值的标头不会被记录,除非您将 remote-address-header 标志设置为 on。默认为off

    现在可以在 Spray 文档中找到更多信息。 http://spray.io/documentation/1.2.4/spray-routing/misc-directives/clientIP/#example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2012-04-06
      • 2023-03-10
      • 2015-10-03
      • 2010-12-26
      • 2014-08-07
      相关资源
      最近更新 更多