2013-08-16 28 views
3

我正在使用Apache HttpClient生成Post請求並提交數據。 由於遠程應用程序中繼提交數據的用戶的IP地址,我想發送用戶指定IP地址的發佈請求。從Java中的特定IP生成HttpRequest

我該如何配置?

public static void loginUser(String username, String password, String ip) throws Exception{ 
     try { 
      HttpClient client = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://login.myapp.com/"); 

      // Request parameters and other properties. 
      List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
      params.add(new BasicNameValuePair("username",username)); 
      params.add(new BasicNameValuePair("password", password)); 
      httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); 

      // Execute and get the response. 
      HttpResponse response = client.execute(httppost); 
      HttpEntity entity = response.getEntity(); 

      if (entity != null) { 
       //etc.... 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

編輯:爲了避免混淆,

我想包括在HttpRequest的頭自定義的IP地址,以便 終端應用的人都知道,這個請求[從我的應用程序]從定製 IP來了地址但不是來自我的應用程序運行的IP地址

假設我的應用程序在IP地址爲「1.1.1.0」的服務器上運行。 現在我的用戶正在執行帶有「test」,「test」,「199.199.199.0」的loginUser方法。 現在從應用程序到目的地URL的HTTP請求應該去爲它從「199.199.199.0」發送

+0

你想獲得客戶端的IP? – smk

+0

請說明你正在嘗試做什麼。 –

+0

@JasonC我想包含自定義IP地址在httprequest頭,以便最終應用程序知道[從我的應用程序]這個請求來自自定義IP地址,但不是從我的應用程序正在運行的IP地址 – Reddy

回答

7

OP寫道:

我想包括在HttpRequest的頭自定義IP地址,以便最終應用程序知道[從我的應用程序]這個請求來自自定義IP地址,但不是從我的應用程序正在運行的IP地址
...
比方說,我打開google.co.in,現在谷歌服務器知道這個請求來自我的IP地址。現在如果我在Apache中使用HttpClient的,我怎麼配置的IP地址,以便在谷歌服務器讀取,它將把該請求最初來自該IP地址

你不能來了。

(這實際上是我在下面原來的答覆中寫道第四解釋。)

發件人的IP地址沒有被作爲一個HTTP頭。它發送到IP協議頭的一個字段中。服務器在套接字級別獲取發件人的IP地址,並不從HTTP信息中獲取。

不,你不能僞造你的IP(這就是所謂的「欺騙」),即使你想。 Java對原始套接字沒有本地支持,您無法修改IP級別的信息。即使您可以(或者您使用JNI或某些出站數據包過濾應用程序或硬件),TCP的本質也會導致IP欺騙對您的情況毫無用處(響應將發送給假IP,以及許多其他難題這個答案的範圍)。

所以,不,你不能做你想做的事情。您或者需要爲您嘗試連接的服務器的管理員爲您制定特殊規則,或者您需要認真重新考慮應用程序的設計。

編輯:其他替代

我對這個問題的意見中提到這些,但我在這裏,包括他們在我的答案,以及用於完整性:

一個可能的解決方案,根據您的安全要求是爲用戶設置VPN訪問權限,以便用戶必須先建立VPN連接,然後在內部服務器上運行您的Web應用程序。

您也可以讓您的網絡服務器通過VPN連接到您的網絡,並通過VPN鏈接直接訪問您的內部登錄服務,並在WAN鏈接上運行Web應用程序。


這是我原來的答覆之前的OP明確的要求:

真不明白你問,所以我會回答我能想到的可能是什麼。

如果你的意思是希望讓用戶指定要發送後到服務器的IP地址,只是建立在IP地址的網址:

HttpPost httppost = new HttpPost("http://" + ip + "/"); 

如果你的意思是你想要的服務器根據用戶的IP地址執行某些操作:當服務器接收到請求時,用戶的IP地址將在服務器端可用,您不需要明確發送它。具體如何訪問服務器端的信息取決於您使用的服務器。

如果你的意思是你希望用戶能夠指定發送到服務器的IP地址,只是把它就像你送的其他參數:如果你的意思,你是

params.add(new BasicNameValuePair("whatever", ip)); 

登錄到依賴於用戶IP地址的系統,代表遠程用戶從服務器登錄,並且您想假裝成爲該遠程用戶,以便登錄成功:您不能。您正在嘗試登錄的系統具有適當的安全措施,以防止您正在嘗試執行的操作。也許這個系統的所有者可能爲你的服務器的IP地址設置一個例外;你不得不問他們。

+0

抱歉不夠清楚。比方說,我打開google.co.in,現在谷歌服務器知道這個請求來自我的IP地址。現在如果我在Apache中使用HttpClient,我該如何配置該IP地址,以便當谷歌服務器讀取時,它會處理這個請求最初來自該IP地址 – Reddy

+0

答案更新。 –

2

由於TCP的工作原理,這是不可能的。這是關於網絡。使用什麼工具/編程語言並不重要。
通過試圖僞裝成另一個IP,TCP無法完成握手,也無法發送您的數據。 使用UDP,你可以做到這一點,但HTTP(網絡)協議基於TCP,所以沒有用。

進一步閱讀一些參考文獻:
TCP handshake
TCP details
UDP details