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

Ale*_*x K 16 scala http 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)
Run Code Online (Sandbox Code Playgroud)

这是我从浏览器做的请求.基本上我在寻找:

path("check") {
       get {
         implicit request => {
           val a = 5
         }
       }
     } ~
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*x K 30

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

# spray-can config
spray.can {
  server {
    remote-address-header = on
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,你是对的,它目前没有记录.一旦我们记录了clientIp指令,它将完全包含该文档.对不起,你必须找到困难的方法. (2认同)

4le*_*x1v 17

如果你正在使用喷射路由,那么有一个指令用于解压缩客户端ip clientIP= =)要使用它只需写:

(path("somepath") & get) {
  clientIP { ip =>
    complete(s"ip is $ip")
  }
}
Run Code Online (Sandbox Code Playgroud)

更简单,但您仍然需要添加显式配置以从请求中获取IP.还有一点评论,也许我没有得到什么,但在喷雾中没有implicit request.实际上传入的请求通过您的路由结构渗透,如果您查看路由库,您将看到该路由只是一个别名:type Route = RequestContext => Unit.因此,如果您需要在某个时刻访问上下文,请写入:

(path("somepath") & get) {
  clientIP { ip => 
    reqCont => reqCont.complete(s"ip is $ip")
  }
}
Run Code Online (Sandbox Code Playgroud)

但请记住静态路径部分和动态部分.

  • 这是一个好方法,但我的答案也非常重要.这实际上是我的主要问题. (2认同)