如何在Spray框架中获取传入的IP地址

时间:2013-09-27 02:00:42

标签: http scala ip-address akka spray

我正在查看正在进入的标头,但似乎没有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地址的信息。非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:16)

如果您正在使用喷涂路由,那么有一个指令用于提取名为clientIP =的客户端IP 要使用它,只需写:

(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")
  }
}

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

答案 2 :(得分:0)

您需要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