Как получить входящий IP-адрес в инфраструктуре 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-адресе. Любая помощь очень ценится. спасибо.
Ответы
Ответ 1
Если вы используете распылительную маршрутизацию, тогда существует директива для извлечения клиентского 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")
}
}
Но помните о статической части маршрута и динамической части.
Ответ 2
Проблема была в конфигурации, это плохо документировано. Добавьте это:
# spray-can config
spray.can {
server {
remote-address-header = on
}
}
заставляет спрей добавлять удаленный IP-заголовок к основным заголовкам. Заголовок адреса будет иметь имя Remote-Address.
Ответ 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