从Java中的特定IP生成HttpRequest

我正在使用Apache HttpClient生成Post请求并提交数据。 由于远程应用程序在提交数据的用户的IP地址上进行中继,因此我想发送用户指定IP地址的发布请求。

我该如何配置?

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 params = new ArrayList(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”发送的

OP写道:

我想在httprequest标头中包含自定义IP地址,以便最终应用程序知道[来自我的应用程序]此请求来自自定义IP地址,但不是来自运行我的应用程序的IP地址

假设我打开google.co.in,现在谷歌服务器知道这个请求来自我的IP地址。 现在,如果我在apache中使用HttpClient,我如何配置该IP地址,以便当谷歌服务器读取时,它将处理此请求最初来自该IP地址

你不能。

(这实际上是我在下面的原始答案中写的第4种解释。)

发件人的IP地址不会作为HTTP标头发送。 它在IP协议头中的字段中发送。 服务器在套接字级别获取发送方的IP地址低,但不从HTTP信息获取它。

不,你不能伪造你的IP(它被称为“欺骗”),即使你想。 Java没有对原始套接字的本机支持,您无法在IP级别修改信息。 即使您可以(或者您使用JNI或某些出站数据包过滤应用程序或硬件),TCP的性质使IP欺骗对您的情况无效(响应将被发送到假IP,以及许多其他困难,远远超出这个答案的范围)。

所以,不,你不能做你想做的事。 您需要为要连接的服务器的管理员制定特殊规则,或者需要认真重新考虑应用程序的设计。

编辑:其他替代品

我在这个问题的评论中提到了这些,但我在答案中也包括它们以及完整性:

根据您的安全要求,一种可能的解决方案是为用户设置VPN访问权限,以便用户必须首先建立VPN连接,然后在内部服务器上运行Web应用程序。

您还可以通过VPN将Web服务器连接到网络,并通过VPN链接直接访问内部登录服务,Web应用程序在WAN链接上运行。


在OP澄清要求之前,这是我的原始答案:

不太清楚你在问什么,所以我会回答我能想到的可能性。

如果您的意思是想让用户指定要发送post的服务器的IP地址,只需从IP地址构建URL:

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

如果您的意思是希望服务器根据用户的IP地址执行某些操作:当服务器收到请求时,服务器端将提供用户的IP地址,您无需明确发送。 服务器端的具体访问方式取决于您使用的服务器。

如果您希望用户能够指定发送到服务器的IP地址,只需像发送其他参数一样发送:

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

如果您的意思是登录到依赖于用户IP地址的系统, 代表远程用户从您的服务器登录,并且您想假装成该远程用户以便登录成功:您不能。 您尝试登录的系统已采取安全措施,以防止您正在尝试执行的操作。 也许该系统的所有者可能为您的服务器的IP地址添加例外; 你必须问他们。

由于TCP的工作原理,这根本不可能。 这是关于网络。 使用什么工具/编程语言并不重要。
通过尝试将自己伪装成另一个IP,TCP无法完成握手,也无法发送数据。 使用UDP,您可以执行此操作,但HTTP(Web)协议基于TCP,因此没有用处。

一些参考文献进一步阅读:
TCP握手
TCP细节
UDP详细信息