3

HttpServletRequest から IP を取得しようとしたときに問題が発生しました。最初に私のコーディングを参照してください。

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();
        }
        return ip; 

私の問題は、「https://192.168.18.111:8443/test/main.html」という URL (私の PC の URL は 18.111 で、サーバーは localhost に展開されています) でアプリケーションを開いた場合、上記のコーディングで正しい URL を取得できましたが、 "https://localhost:8443/test/main.html" で開くと、上記の関数で "0.1.0.1...." のようなものが返されます。 HttpServletRequest から IP を取得するより良い方法があるかどうかは誰にもわかりませんか?

4

2 に答える 2

6

メソッドの結果は完全に正しいです。あなたが得ている数字は だと思います0:0:0:0:0:0:0:1。ループバック アドレスの有効な形式です。ただし、IPv6 形式の localhost だけです。localhost の IPv4 アドレスは 、localhost127.0.0.1の IPv6 アドレスは です0:0:0:0:0:0:0:1

問題は、URLhttps://localhost:8443/test/main.htmlがデフォルトで IP プロトコルの両方のバージョンに一致することです。どうやらあなたのブラウザはIPv6を使用することを選択しています。

127.0.0.1ローカル テストでは、 name の代わりにリテラル アドレスを使用してみてくださいlocalhost。または、DNS 設定で IPv4 アドレスのみを持つようにすることもできます。

于 2013-01-06T21:00:46.650 に答える
1

やってみませんか

request.getRemoteAddr()

それだけ?元の IP アドレス (「X-Forwarded-For」によって提供されるもの) が本当に必要ですか? 上部のメソッドによって提供される、アドレス指定可能なリソースの代わりに、ダムの LAN アドレスを表示するのは役に立たない場合があると思います。

後で編集:

この質問を見てください:固定されているように見えるユーザーの IP アドレスを見つけています。

于 2013-01-06T12:14:36.847 に答える