2014-04-05 11 views
39

Pracuję nad projektem kontrolera Wiosna MVC w którym Robię URL GET rozmowę z przeglądarki -Jak wyodrębnić adres IP w Spring MVC Controller uzyskać połączenie?

Poniżej znajduje się adres URL, który Robię wezwanie GET z przeglądarki -

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

i poniżej jest kod w której przychodzi połączenie po uderzeniu w przeglądarce - Oświadczenie

@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 
    } 

problem: -

Czy jest jakiś sposób, mogę wyodrębnić adres IP z jakiegoś nagłówka? Znaczenie chciałbym wiedzieć, z którego adresu IP przychodzi wywołanie, co oznacza, że ​​ktokolwiek dzwoni powyżej adresu URL, muszę znać jego adres IP. Czy to się da zrobić?

Odpowiedz

76

Rozwiązaniem jest

@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 
    } 

Dodaj HttpServletRequest request do definicji metody, a następnie użyć Servlet API

Wiosna Dokumentacja here powiedział w

15.3.2.3 Obsługiwane argumenty metoda obsługi i zwrotu typy

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

Dzięki Koitoer za pomoc. Jedno szybkie pytanie, przypuśćmy, że jeśli połączenie pochodzi z Load Balancera zamiast konkretnej maszyny, to też będzie działać? Chyba nie .. – john

+0

Nie, nie, ale w loadbalance jest jakaś konfiguracja, która może wysłać IP, ponieważ one nie istnieją, prawdopodobnie to jest twój przypadek – Koitoer

+0

Sprawdź, czy prawdopodobnie moduł równoważenia obciążenia może wysyłać te wartości w nagłówku, więc rozważ użycie getHeader metoda HttpServletRequest. – Koitoer

61

Spóźniłem się tutaj, ale to może pomóc komuś w szukaniu odpowiedzi. Zazwyczaj działa servletRequest.getRemoteAddr().

W wielu przypadkach użytkownicy aplikacji mogą uzyskiwać dostęp do serwera WWW za pośrednictwem serwera proxy lub aplikacja znajduje się za modułem równoważenia obciążenia. Aby uzyskać adres IP użytkownika, należy uzyskać dostęp do nagłówka http X-Forwarded-For w takim przypadku.

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

Mam nadzieję, że to pomoże.

+1

Dobre połączenie. Rewizja. – Unheilig

+5

Zauważ, że 'X-Forwarded-For' jest ogólnie rozdzieloną przecinkami listą ips, przy czym każdy serwer proxy w łańcuchu dodaje zdalny adres, który widzi do listy. Tak więc dobra implementacja miałaby na ogół listę zaufanych serwerów proxy i "pomijanie" tych komunikatów podczas czytania tego nagłówka od prawej do lewej. – Raman

+0

jak uzyskać adres IP jako 111.111.111.111/X –

1

można uzyskać adres IP statycznie z RequestContextHolder jak poniżej:

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

String ip = request.getRemoteAddr();