2013-09-27 11 views
16

ich Header suchen, die in kommen, aber keine IP dort zu sein scheint:Wie Adresse eingehende IP in Spray Rahmen bekommen

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) 

Dies ist eine Anfrage ich von Browser tat. Ich suche grundsätzlich:

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

Hier Anfrage Objekt hat keine Informationen über die IP-Adresse. Jede Hilfe wird sehr geschätzt. Vielen Dank.

Antwort

15

Wenn Sie Spray-Routing verwenden, dann eine Richtlinie dort zum Extrahieren von Client-IP-clientIP =) genannt ist, es zu benutzen Sie einfach schreiben:

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

mehr als einfach, aber Sie müssen noch explizit hinzufügen müssen Konfiguration, um IP von Anfrage zu bekommen. Und ein kleiner Kommentar, vielleicht habe ich nichts bekommen, aber im Spray gibt es kein implicit request. Tatsächlich eingehende Anfrage durchläuft Ihre Routing-Struktur, wenn Sie einen Blick in die Routing-Bibliothek werfen Sie sehen, dass die Route nur ein Alias ​​ist: type Route = RequestContext => Unit. Also, wenn Sie zu einem bestimmten Zeitpunkt Zugriff auf den Kontext erhalten müssen nur schreiben:

Aber denken Sie daran über statischen Route Teil und dynamischen Teil.

+2

Das ist ein guter Weg, aber meine Antwort ist auch sehr relevant. Das war eigentlich das Hauptproblem für mich. –

28

Das Problem war in der Konfiguration, dies ist nicht gut dokumentiert. Hinzufügen dieser:

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

zwingt Spray, um Remote-IP-Header zu den Hauptheadern hinzuzufügen. Der Adressheader hat den Namen Remote-Address.

+2

Ja, Sie haben Recht, es ist derzeit nicht dokumentiert. Sobald wir die Anweisung clientIp dokumentieren, wird genau diese Dokumentation enthalten sein. Entschuldige, dass du es auf die harte Tour herausfinden musstest. – jrudolph

+0

@jrudolph Funktioniert es mit Spray Servlet? – expert

+0

@jrudolph Noch fehlt. http://spray.io/documentation/1.1.3/spray-routing/misc-directives/clientIP/#description 2 Jahre, kein Druck. – flavian