2014-04-05 5 views
39

Ich arbeite an Spring MVC-Controller-Projekt, in dem ich mache einen GET URL-Aufruf aus dem Browser -Wie IP-Adresse im Frühjahr zu extrahieren MVC Controller Anruf erhalten?

Im Folgenden finden Sie die URL durch der ich mache einen GET Anruf aus dem Browser -

http://127.0.0.1:8080/testweb/processing?workflow=test&conf=20140324&dc=all 

und unten ist der Code, in dem der Anruf nach im Browser schlagen kommt -

@RequestMapping(value = "processing", method = RequestMethod.GET) 
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow, 
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc) { 

     System.out.println(workflow); 
     System.out.println(value); 
     System.out.println(dc); 

     // some other code 
    } 

Problemstellung: -

Jetzt gibt es einen Weg, ich kann IP-Adresse aus einem Header extrahieren? Bedeutung Ich würde gerne wissen, von welcher IP-Adresse, Anruf kommt, was bedeutet, wer anruft über URL, muss ich ihre IP-Adresse wissen. Ist das möglich?

Antwort

76

Die Lösung ist

@RequestMapping(value = "processing", method = RequestMethod.GET) 
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow, 
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc, HttpServletRequest request) { 

     System.out.println(workflow); 
     System.out.println(value); 
     System.out.println(dc); 
     System.out.println(request.getRemoteAddr()); 
     // some other code 
    } 

HttpServletRequest request auf Ihre Methodendefinition hinzufügen und dann die API Servlet

Frühling Dokumentation here sagte in

15.3.2.3 Unterstützte Handler-Methode Argumente und Rückgabe verwenden Typen

Handler methods that are annotated with @RequestMapping can have very flexible signatures. 
Most of them can be used in arbitrary order (see below for more details). 

Request or response objects (Servlet API). Choose any specific request or response type, 
for example ServletRequest or HttpServletRequest 
+0

Danke für die Hilfe Koitoer. Eine kurze Frage: Angenommen, der Anruf kommt von Load Balancer anstatt von einer bestimmten Maschine, dann funktioniert das auch? Ich denke nicht .. – john

+0

Nein, es ist nicht, aber es gibt einige Konfiguration im Loadbalancer, die die IP senden können, wie sie nicht existiert, wahrscheinlich ist dies Ihr Fall – Koitoer

+0

Überprüfen Sie wahrscheinlich Load Balancer kann diese Werte in einer Kopfzeile senden, so in Betracht ziehen getHeader-Methode von HttpServletRequest. – Koitoer

61

Ich bin spät hier, aber das könnte jemand auf der Suche nach der Antwort helfen. Normalerweise funktioniert servletRequest.getRemoteAddr().

In vielen Fällen greifen Ihre Anwendungsbenutzer möglicherweise über einen Proxyserver auf Ihren Webserver zu, oder Ihre Anwendung befindet sich möglicherweise hinter einem Lastenausgleichsmodul.

So sollten Sie in einem solchen Fall auf die X-Forwarded-For http-Header zugreifen, um die IP-Adresse des Benutzers zu erhalten.

z.B. String ipAddress = request.getHeader("X-FORWARDED-FOR");

Hoffe das hilft.

+1

Guter Anruf. Upvoted. – Unheilig

+5

Beachten Sie, dass 'X-Forwarded-For 'im Allgemeinen eine durch Kommas getrennte Liste von ips ist, wobei jeder Proxy in der Kette die entfernte Adresse, die er sieht, zur Liste hinzufügt. Eine gute Implementierung würde also in der Regel eine Liste vertrauenswürdiger Proxies enthalten und diese ips überspringen, wenn sie diesen Header von rechts nach links lesen. – Raman

+0

Wie bekomme ich die IP-Adresse als 111.111.111.111/X –

1

Sie können die IP-Adresse erhalten statisch vom RequestContextHolder wie folgt:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) 
     .getRequest(); 

String ip = request.getRemoteAddr();