我有一个托管在 localhost 中的机器上托管的 jsp Web 应用程序。
我可以从 LAN 上的另一台机器访问此 Web 应用程序。我在这里所做的是我创建了一个 bean 类,它有一个返回访问 Web 应用程序的机器 IP 的方法。但是当我从另一台机器访问时,我得到了托管机器本身的 IP。谁能告诉它为什么会发生?告诉我如何获取访问本地主机中托管的 Web 应用程序的另一台机器的 IP。
您不能可靠地这样做,但是如果您可以控制所有客户端和服务器之间的网络,并且如果您愿意接受恶意请求可能会向您提供虚假信息,那么可以使用像ServletRequest.getRemoteAddr()这样的方法会给你那种信息。重申一下,它绝不保证是最初发送请求的机器的地址,也保证它在任何方面都是真实的。鉴于正确(或错误?)的网络条件,很容易欺骗该信息。
这是使用网络服务来获取 IP 地址 看看
package ipInfo;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
public class ExternalIp {
private static String URL = "http://api-sth01.exip.org/?call=ip";
public static void main(String[] args) {
ExternalIp ipGetter = new ExternalIp();
ipGetter.getExternalIp();
}
public void getExternalIp()
{
BufferedReader reader = null;
String line = "";
int tries = 0;
do {
try {
reader = read(URL);
/*while(reader.readLine() != null)
{
line = line + reader.readLine();
}*/
line = reader.readLine();
}
catch (FileNotFoundException fne) {
System.out.println("File not found for url: " + URL);
System.out.println("Check your typing");
System.out.println();
return;
}
catch (IOException ioe) {
System.out.println("Got IO Exception, tries = " + (tries + 1));
System.out.println("Message: " + ioe.getMessage());
tries++;
try {
Thread.currentThread().sleep(300000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
continue;
}
catch (Exception exc) {
exc.printStackTrace();
}
} while (reader == null && tries < 5);
if (line != null && line.length() > 0) {
System.out.println("Your external ip address is: " + line);
}
else {
System.out.println("Sorry, couldn't get your ip address");
}
}
public BufferedReader read(String url) throws Exception{
return new BufferedReader(
new InputStreamReader(
new URL(url).openStream()));
}
}