2013-08-07 11 views
9

を検出する方法:Javaの - 私は方法下記経由<code>Client</code> IPアドレスを取得していたIPバージョン

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

は今、私はそれがIPV4IPV6であるかどうかを検出します。

+2

あなたがここに述べhttp://www.java2s.com/Code/Java/Network-Protocol/Det​​ermineifthegivenstringisavalidIPv4orIPv6addressとして正規表現を使用することができます。

これは、私は小さな変更でthis exampleで使用しようとしているものです。 htm – Tala

+0

X-Forwarded-Forが* your *サーバ(BigIP F5のような)によって設定されていない限り、クライアントが何かに設定できるので信頼できないことに注意してください。 – lapkritinis

答えて

15

それは

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

IPv4またはIPv6のインスタンスになった場合は、InetAddressのを作成し、チェックすることができますしかし、それは少し厄介なようだ、と私はよりよい解決策があると願っています。

+0

どうすればいいですか?自家製の正規表現ではなく、JDKに依存しています。私には良いと思われる。 – EJP

+2

これはinstanceofに依存しないという点で優れています。 InetAddressに、使用されているバージョンを示す定数を返すメソッドを持たせるとよいでしょう。 – Bex

5

IPv4またはIPv6のいずれかを取得していると思われる場合は、次の方法を試すことができます。あなたが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

'else'部分の' Inet4Address'を 'Inet6Address'に変更してください。 – tokhi

+0

完了、ありがとうございました – morgano

0

ありがとうTala

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

独自の正規表現を使用しないでください。 instanceofソリューションを使用します。 – EJP

+1

ありがとう、ええ、 'instanceof'がより効率的です。 – tokhi

+2

効率について何も言わなかった。あなた自身のコードではなく、JDKに組み込まれているので、*正しい*です。 – EJP

関連する問題