0

Web アプリケーションにアクセスするクライアント マシンの IP アドレスを取得することになっています。グーグルで調べたところ、次の 2 つの方法が見つかりました。

  1. request.getRemoteAddr()

  2. request.getHeader("X-FORWARDED-FOR")

ただし、どちらもクライアント マシンの実際の IP を返すことを保証するものではありません。また、アプリケーションは struts1.2 で開発されているため、 struts1.2を使用して同じことを達成することになっています。

同じためのStrutsクラスはありますか?

次のコードを使用しています。

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

しかし、モバイルまたはワイヤレス デバイスからアプリケーションにアクセスすると、メソッドrequest.getHeader("X-FORWARDED-FOR");が返されます。null

その結果、メソッドから ip が取得されますrequest.getRemoteAddr(); 。問題は、取得された ip がプライベートでパブリックではなく、クライアントのパブリック ipが 必要なことです。

4

2 に答える 2

1

request.getRemoteAddr()ほとんどの場合、正しいアドレスが返されます (これは Java EE の一部であり、struts ではありません)。クライアント マシンの実際の IP を返すことは保証されません。これは、構造体や Java 自体ではなく、TCP/IP の制限の問題であるためです。

于 2012-09-13T05:06:41.873 に答える
1

問題は、それを保証する方法がないことです。クライアントはNATされている可能性があるため、クライアントが知っているアドレスを見つけることはできません.一部の場所) では、クライアントのアドレスが何であるかをプロキシが通知することを保証する方法はありません。ひどく壊れたプロキシがいくつかあり、正しく動作している場合でも、探している情報を隠すように構成されている場合があります。

最も簡単な方法は、クライアントで JavaScript を実行して情報を検出し、バックグラウンド リクエストで送信することです。しかし、いずれにせよ、クライアントのアドレスはあまり役に立たないことが多いことがわかります。認証目的 (NAT と DHCP を介した動的アドレス割り当てが広く普及しているため、同じ「内部」アドレスを持つ別のクライアントを頻繁に取得することを意味します) またはクライアントに接続し直す (ほとんどのクライアントは強力なファイアウォールがあるか、その背後にある)、なぜログに記録する必要があるのか​​ わかりません。それはあなたが求めることができる最も役に立たないことについてです。この問題から一歩離れて、自分が本当にしようとしていることをもう一度考えてみることをお勧めします。

于 2012-09-15T11:22:20.110 に答える