2010-06-25 101 views
13

我已經用Spring/GWT爲使用Flash上​​傳文件的Web應用程序提供了一個網絡應用程序。爲什麼request.getRemoteAddr()根據上下文返回ipv4或ipv6

當我發送一個Ajax請求使用GWT,並得到用戶的IP地址,我得到一個IPv4地址,如:127.0.0.1

,但是當我上傳我的文件與Flash(因此POST請求上相同的web應用)我得到的IPv6地址0:0:0:0:0:0:0:1

我使用相同的代碼,以獲取用戶的IP是:

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

問題是我使用的簽名,使用IP地址,以確保用戶可以上傳文件(由於錯誤會話丟失uploa與閃光丁)和IP地址改變,當我使用ajax或通過閃光後。

什麼問題,我怎麼能得到相同的ip格式?

感謝

+0

您無法控制用戶使用的IP地址,而是嘗試使用Cookie。 – 2014-12-02 00:23:31

回答

11

的原因是,您在瀏覽器中鍵入名稱既具有IPv4和IPv6地址。瀏覽器選擇使用ipv4,flash選擇使用ipv6。在服務器端沒有什麼可以做的(沒有辦法轉換)。
但是,您可以更改您的DNS並使您的名稱只有一個地址,即ipv4或ipv6。您也可以連接一個文字IP地址(127.0.0.1),而不是名稱(本地主機)。

+2

那麼,我如何識別用戶?不要求他改變各種設置。 – 2010-06-25 14:42:10

+0

您(客戶)使用的主機名是什麼?它是本地主機嗎?它是真正的主機名嗎? – unbeli 2010-06-25 14:49:37

+0

本地主機(爲我調試時)和真正的主機名(實際客戶端) – 2010-06-25 14:57:07

31

你可以通過這個標誌

-Djava.net.preferIPv4Stack=true 
+0

這對我來說訣竅 – RJo 2015-06-01 07:30:48

+0

這對我有用。 – 2016-06-07 05:52:37

0

你會得到一個IPv6地址,則正在使用的IPv6啓動服務器解決它。 IPv4和IPv6是不同的協議,當客戶端可用時,客戶端選擇使用哪一個協議。

如果你想要客戶的IPv4地址,那麼你可以強制他們使用它,而不是在DNS中通告IPv6地址。儘管隨着IPv6的部署日益增多,這將是一個糟糕的主意。支持兩者都很好,所以最好與使用IPv6的客戶打交道。

相關問題