2013-08-07 11 views
9

पता लगाने के लिए मैं विधि नीचे के माध्यम से Client आईपी पते हो रही है:जावा - कैसे IP संस्करण

public static String getClientIpAddr(HttpServletRequest request) { 
    String ip = request.getHeader("X-Forwarded-For"); 
    ... 
    return ip 
} 

अब मैं अगर यह एक IPV4 या एक IPV6 है पता लगाने के लिए चाहते हैं।

+2

आप के रूप में यहाँ http://www.java2s.com/Code/Java/Network-Protocol/DetermineifthegivenstringisavalidIPv4orIPv6address कहा regex का उपयोग कर सकते हैं। एचटीएम – Tala

+0

ध्यान रखें कि जब तक एक्स-फॉरवर्ड-फॉर * आपके * सर्वर (बिगिप एफ 5 की तरह) द्वारा सेट नहीं किया जाता है, तो इसे विश्वसनीय नहीं किया जा सकता क्योंकि इसे क्लाइंट द्वारा किसी भी चीज़ पर सेट किया जा सकता है। – lapkritinis

उत्तर

15

आप एक InetAddress बना सकते हैं और अगर यह एक IPv4 या IPv6 उदाहरण

InetAddress address = InetAddress.getByName(ip); 
if (address instanceof Inet6Address) { 
    // It's ipv6 
} else if (address instanceof Inet4Address) { 
    // It's ipv4 
} 

यह थोड़ा अजीब लगता है, हालांकि हो गया चेक करें, और मुझे आशा है कि वहाँ एक बेहतर समाधान है।

+0

बेहतर कैसे? यह घर से उगाए जाने वाले रेगेक्स की बजाय जेडीके पर निर्भर करता है। मुझे ठीक लगता है। – EJP

+2

उसमें बेहतर यह उदाहरण पर भरोसा नहीं करता है। InetAddress में एक विधि होना अच्छा लगेगा जो संस्करण का उपयोग करने के संकेत को स्थिर करता है। – Bex

5

यदि आप सुनिश्चित हैं कि आप या तो आईपीवी 4 या आईपीवी 6 प्राप्त कर रहे हैं, तो आप निम्न कोशिश कर सकते हैं। यदि आपके पास DNS नाम है तो यह एक लुकअप करने का प्रयास करेगा। वैसे भी, इसे आजमाएं:

try { 

    InetAddress address = InetAddress.getByName(myIpAddr); 

    if (address instanceof Inet4Address) { 
     // your IP is IPv4 
    } else if (address instanceof Inet6Address) { 
     // your IP is IPv6 
    } 

} catch(UnknownHostException e) { 

    // your address was a machine name like a DNS name, and couldn't be found 

} 
+0

कृपया 'इनसेट 4 एड्रेस' को 'else'Address' में' else' भाग में बदलें। – tokhi

+0

हो गया, – morgano

0

Tala के लिए धन्यवाद।

यह है कि मैं क्या मामूली परिवर्तन के साथ this example का उपयोग करने की कोशिश की है:

private static Pattern VALID_IPV4_PATTERN = null; 
    private static Pattern VALID_IPV6_PATTERN = null; 
    private static final String ipv4Pattern = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])"; 
    private static final String ipv6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}"; 

    static { 
    try { 
     VALID_IPV4_PATTERN = Pattern.compile(ipv4Pattern, Pattern.CASE_INSENSITIVE); 
     VALID_IPV6_PATTERN = Pattern.compile(ipv6Pattern, Pattern.CASE_INSENSITIVE); 
    } catch (PatternSyntaxException e) { 
     //logger.severe("Unable to compile pattern", e); 
    } 
    } 

    public static String isIpAddressV4orV6(String ipAddress) { 

     Matcher ipv4 = IP_Utilities.VALID_IPV4_PATTERN.matcher(ipAddress); 
     if (ipv4.matches()) { 
      return "IPV4"; 
     } 
     Matcher ipv6 = IP_Utilities.VALID_IPV6_PATTERN.matcher(ipAddress); 
     if (ipv6.matches()) { 
       return "IPV6"; 
     } 
     return ""; 
    } 
+0

के लिए धन्यवाद इसके लिए अपने स्वयं के regex का उपयोग न करें। उदाहरण के उदाहरण का प्रयोग करें। – EJP

+1

धन्यवाद, हाँ 'exampleof' अधिक कुशल है। – tokhi

+2

मैंने दक्षता के बारे में कुछ भी नहीं कहा। यह अधिक * सही * है क्योंकि यह आपके स्वयं के कोड होने के विरोध में जेडीके में बनाया गया है। – EJP

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