Как получить входящий 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