2012-09-07 24 views
19

मैंने जेएसएफ 2.0 का उपयोग कर वेब एप्लिकेशन बनाया है। मैंने इसे होस्टिंग साइट पर होस्ट किया है और होस्टिंग साइट का सर्वर यूएस में आधारित है।उपयोगकर्ता आईपी पता ढूँढना

मेरा ग्राहक उस उपयोगकर्ता का विवरण चाहता है जिसने सभी साइट पर पहुंचा। मैं जेएसएफ में उपयोगकर्ता का आईपी पता कैसे पा सकता हूं?

मैं

try { 
     InetAddress thisIp = InetAddress.getLocalHost(); 
     System.out.println("My IP is " + thisIp.getLocalHost().getHostAddress()); 
    } catch (Exception e) { 
     System.out.println("exception in up addresss"); 
    } 

साथ करने की कोशिश की लेकिन यह मुझे मेरी साइट केवल यदि सर्वर आईपी पते का IP पता देता है।

क्या कोई मुझे बता सकता है कि जावा का उपयोग करके वेबसाइट का उपयोग करने वाले आईपी पते को कैसे प्राप्त किया जाए?

+2

जिस विधि का आप उपयोग कर रहे हैं, वह एक कामकाजी है, लेकिन यह आईपी पता लगाएगा जहां एप्लिकेशन चल रहा है, लेकिन उपयोगकर्ता का नहीं। – Addicted

+0

@ अभ्यर्थी: मुझे पता है ... मैंने उल्लेख किया है कि प्रश्न में ... –

उत्तर

52

मैं

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
if (ipAddress == null) { 
    ipAddress = request.getRemoteAddr(); 
} 
System.out.println("ipAddress:" + ipAddress); 
+7

'एक्स-फॉरवर्डेड-फॉर हेडर कमजोर है प्रारूप। आपको केवल पहले भाग में रुचि होनी चाहिए, यदि कोई हो। – BalusC

+0

क्या प्रॉक्सी में 1 से अधिक सर्वर शामिल हैं? * कारण: * मैं प्रॉक्सी के रूप में 10.11.101.33 का उपयोग कर रहा हूं और मेरा आईपी 10.11.33.102 है और यह कोड मुझे 10.11.101.31 देता है। क्या 33 पहले 31 अनुरोध करता है? प्रॉक्सी – Sarz

+0

बिना परीक्षण के ठीक काम करता है क्योंकि परीक्षण के लिए बहुत अच्छा नहीं है क्योंकि आप FacesContext = * पर निर्भर करते हैं ( –

4

इस प्रयास करें ...

HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String ip = httpServletRequest.getRemoteAddr(); 
+8

यह विफल रहता है अगर क्लाइंट (या सर्वर) प्रॉक्सी का उपयोग करता है। – BalusC

+1

@ बाल्लूसी एक्स-फॉरवर्डेड-फॉर (एक्सएफएफ) HTTP हेडर एक HTTP प्रॉक्सी विकी, के माध्यम से किसी वेब सर्वर से कनेक्ट करने वाले क्लाइंट के मूल आईपी पते की पहचान करने के लिए एक वास्तविक तथ्य है, लेकिन यदि अनुरोध सीधे क्लाइंट से आ रहा है यह शून्य वापस आ सकता है। एक और मुद्दा यह है कि इस बात की कोई गारंटी नहीं है कि प्रॉक्सी सर्वर आपके लिए वह हेडर पास करेगा। तो, यह तथ्य कि हेडर शून्य है, इसका मतलब यह नहीं है कि getRemoteAddr द्वारा लौटा आईपी मशीन का वास्तविक आईपी है जो मूल अनुरोध करता है। यह अभी भी प्रॉक्सी सर्वर का आईपी हो सकता है। –

+4

मुझे पता है कि। आपने अभी तक अपने उत्तर को ठीक करने के लिए अभी तक ठीक नहीं किया है। वैसे, आप अपने शब्दों का उपयोग क्यों नहीं करते? सूत्रों का हवाला देते हुए बताएं कि यह आपके स्वयं के शब्द हैं। एसओ पर यहां सीसी-विकी लाइसेंस भी देखें। – BalusC

6

एक अधिक बहुमुखी समाधान के साथ आगे बढ़े

कि काम करता है कई देखते हैं, भले ही स्वीकार किए जाते हैं जवाब का

उन्नत संस्करणX-Forwarded-For हेडर में आईपी पते:

/** 
* Gets the remote address from a HttpServletRequest object. It prefers the 
* `X-Forwarded-For` header, as this is the recommended way to do it (user 
* may be behind one or more proxies). 
* 
* Taken from https://stackoverflow.com/a/38468051/778272 
* 
* @param request - the request object where to get the remote address from 
* @return a string corresponding to the IP address of the remote machine 
*/ 
public static String getRemoteAddress(HttpServletRequest request) { 
    String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
    if (ipAddress != null) { 
     // cares only about the first IP if there is a list 
     ipAddress = ipAddress.replaceFirst(",.*", ""); 
    } else { 
     ipAddress = request.getRemoteAddr(); 
    } 
    return ipAddress; 
} 
संबंधित मुद्दे