web-dev-qa-db-ja.com

request.getRemoteAddr()がコンテキストに応じてipv4またはipv6を返す理由(ポストクエリまたはajaxクエリ)

Flashを使用してファイルをアップロードするSpring/GWTを備えたWebアプリを使用しません。

GWTを使用してajaxリクエストを送信し、ユーザーのIPアドレスを取得しようとすると、127.0.0.1のようなipv4アドレスが取得されます。

しかし、フラッシュを使用してファイルをアップロードすると(つまり、同じWebアプリケーションでのポストリクエストの場合)、ipv6アドレス0:0:0:0:0:0:0:1を取得します

私は同じコードを使用してユーザーIPを取得します。

ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
att.getRequest().getRemoteAddr();

問題は、ユーザーがファイルをアップロードできることを確認するためにIPアドレスを使用する署名を使用していることです(フラッシュを使用してアップロードするとセッションが失われるバグがあるため)、ajaxまたはPost via Flashを使用するとIPアドレスが変更されます。

問題は何ですか?どのように同じIP形式を取得できますか?

ありがとう

24
Jerome Cance

このフラグでサーバーを起動することで修正できます

-Djava.net.preferIPv4Stack=true
47
Ted Bigham

その理由は、ブラウザに入力する名前にipv4アドレスとipv6アドレスの両方が含まれているためです。ブラウザはipv4の使用を選択し、フラッシュはipv6の使用を選択します。サーバー側では何もできません(変換する方法はありません)。
ただし、DNSを変更して、名前にipv4またはipv6の1つのアドレスのみを持たせることができます。名前(localhost)ではなく、リテラルIPアドレス(127.0.0.1)で接続することもできます。

12
unbeli

iPv6アドレスを取得すると、IPv6が使用されます。 IPv4とIPv6は異なるプロトコルであり、クライアントは両方が使用可能な場合にどちらを使用するかを選択します。

クライアントのIPv4アドレスが必要な場合は、DNSでIPv6アドレスをアドバタイズしないことにより、クライアントに強制的に使用させることができます。 IPv6の展開が増えると、それは悪い考えです。両方をサポートすることは良いので、IPv6を使用するクライアントを扱う方が良いです。

0
vikash kumar