2013-08-21 7 views
18

प्राप्त करने का सही तरीका क्या है I मुझे servlet में आईपी प्राप्त करने के कुछ अलग-अलग तरीके मिलते हैं। लेकिन मुझे नहीं पता कि कौन सा सही है और क्यों।अनुरोध के आईपी

1:

request.getHeader("X-Real-IP") 

2:

String ip = request.getHeader("X-Forwarded-For"); 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("WL-Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_CLIENT_IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getRemoteAddr(); 
    } ` 

3:

String ip=request.getHeader("x-forwarded-for"); 
       if(ip==null){ 
        ip=request.getRemoteAddr(); 
       } 
       String ips[]=ip.split(",");` 
           ip=ips[0]; 
+0

की जांच: http://stackoverflow.com/questions/10363069/how-can-i-retrieve-ip-address-from-http-header-in-java/10363109#10363109 –

उत्तर

43

उत्तर जटिल है।

  • अपने सर्वलेट एक वेबसर्वर एक रिवर्स प्रॉक्सी या लोड संतुलन के पीछे है कि पर चल रहा है, तो उस वेब प्रॉक्सी एक अनुरोध हेडर कि आईपी पते कि अनुरोध से आया देता इंजेक्षन करने के लिए कॉन्फ़िगर किया जा सकता है। अलग-अलग रिवर्स प्रॉक्सी अलग-अलग शीर्षकों को इंजेक्ट करेंगे। अपने (फ्रंट एंड) सर्वर के लिए प्रलेखन से परामर्श लें।

  • अपने ग्राहक एक (आगे) प्रॉक्सी का उपयोग करता है, तो यह हो सकता है डालने हेडर कहने के लिए ग्राहक IP पता है क्या ... या यह नहीं हो सकता है। और आईपी पता गलत हो सकता है।

  • मूल्य आप request.getRemoteAddr() फोन करके प्राप्त अनुरोध के तत्काल नदी के ऊपर स्रोत का IP पता होने जा रहा है।

आपके द्वारा सूचीबद्ध शीर्षलेखों में से कोई भी मानक नहीं है, लेकिन "एक्स-फॉरवर्ड-फॉर" को डिफैक्टो मानक माना जाता है; यानी यह वह है जो प्रॉक्सी द्वारा डालने की सबसे अधिक संभावना है, आदि ... अगर कुछ इंजेक्शन दिया जाता है।

अंत में, भले ही आपको आईपी पता मिले, फिर भी यह आपकी मदद नहीं करेगा। उदाहरण के लिए, यदि ग्राहक एक निजी नेटवर्क पर बैठता है और एनएटी गेटवे के माध्यम से इंटरनेट से कनेक्ट होता है, तो HTTP अनुरोध में आईपी पता एनएटी सर्वर का पता होगा ... वास्तविक क्लाइंट आईपी नहीं।


तो इसका क्या मतलब है? खैर मूल रूप से, इसका मतलब है कि सामान्य में आप विश्वसनीय से अनुरोध नहीं कर सकते हैं कि सिस्टम का आईपी पता पता चला है। इस लिंक

+0

आपके लिए महान उत्तर के लिए धन्यवाद, हम nginx + tomcat + spring + spring mvc + mybatis का उपयोग करते हैं, मैं चीन में हूं, यह स्टैक ओवरफ्लो पर मेरा दूसरा प्रश्न है, मेरा पहला असफल रहा है! मुझे लगता है कि हमें इसके बारे में और अधिक परीक्षण करना चाहिए। – sprite

+0

@sprite - आपको यह पता लगाने के लिए nginx दस्तावेज़ जांचना चाहिए कि यह किस शीर्षलेख का उपयोग कर रहा है। लेकिन यह आपको केवल अगले अपस्ट्रीम होस्ट का आईपी पता देगा ... जो वास्तविक ग्राहक नहीं हो सकता है। जैसा कि मैंने कहा था, आप हमेशा वास्तविक ग्राहक आईपी नहीं प्राप्त कर सकते ... और यदि आप कर सकते हैं, तो यह भी विश्वसनीय, उपयोगी या अद्वितीय नहीं होगा। –

+0

ठीक है, मैं लगभग आपकी सलाह समझता हूं। क्या 'अगले अपस्ट्रीम होस्ट का आईपी पता' का मतलब है अंतिम प्रॉक्सी का आईपी पता? @ स्टीफन सी – sprite

8

यह लगता है सबसे हम ग्राहक के मूल आईपी पते पाने के लिए क्या कर सकते हैं

String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
if (ipAddress == null) { 
    ipAddress = request.getRemoteAddr(); 
} 
+0

बहुत – sprite

+5

छोड़कर thankyou जब यह नहीं करता; मेरा जवाब देखें –

+7

यह एक्स-फॉरवर्डेड के बाद से काम नहीं करेगा-फॉर प्रॉक्सी आईपी-पतों की सूची को अलग-अलग अल्पविराम (वैकल्पिक रूप से सफेद स्थान के साथ) में शामिल कर सकता है! – Yeti

संबंधित मुद्दे