公网部署的项目 java后台取得服务器ip是内网的ip是怎么回事
java也是通过底层操作系统的api来获取的,操作系统会返回所有的网卡界面,也会给你每个网卡界面的信息,你需要过滤一下内网IP即可。
先确定web服务器之前有没有代理层,如果没有的话参照一楼提供的方法试试;如果有代理层的话需要由上层代理把client端的ip传进来,一般是放header里,比如x-forwarded-for、Proxy-Client-IP等会将层层代理的ip加进来,然后在应用里去解析
除了上面说的多个网络接口外,还有可能是你的服务端根本就在内网里部署。
前置的接入层(nginx、apache)等是接入外网的,然后将流量打到内网服务器上。
换api:NetworkInterface.getNetworkInterfaces() ,再做过滤,代码如下:
转载:Java获得系统的外网IP
https://www.cnblogs.com/kagome2014/p/6428325.html
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
/**
public class CustomSystemUtil {
public static String INTRANET_IP = getIntranetIp(); // 内网IP
public static String INTERNET_IP = getInternetIp(); // 外网IP
private CustomSystemUtil(){}
/**
* 获得内网IP
* @return 内网IP
*/
private static String getIntranetIp(){
try{
return InetAddress.getLocalHost().getHostAddress();
} catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 获得外网IP
* @return 外网IP
*/
private static String getInternetIp(){
try{
Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
Enumeration<InetAddress> addrs;
while (networks.hasMoreElements())
{
addrs = networks.nextElement().getInetAddresses();
while (addrs.hasMoreElements())
{
ip = addrs.nextElement();
if (ip != null
&& ip instanceof Inet4Address
&& ip.isSiteLocalAddress()
&& !ip.getHostAddress().equals(INTRANET_IP))
{
return ip.getHostAddress();
}
}
}
// 如果没有外网IP,就返回内网IP
return INTRANET_IP;
} catch(Exception e){
throw new RuntimeException(e);
}
}
}
换api:NetworkInterface.getNetworkInterfaces() ,再做过滤,代码如下:
转载:Java获得系统的外网IP
https://www.cnblogs.com/kagome2014/p/6428325.html
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
/**
public class CustomSystemUtil {
public static String INTRANET_IP = getIntranetIp(); // 内网IP
public static String INTERNET_IP = getInternetIp(); // 外网IP
private CustomSystemUtil(){}
/**
* 获得内网IP
* @return 内网IP
*/
private static String getIntranetIp(){
try{
return InetAddress.getLocalHost().getHostAddress();
} catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 获得外网IP
* @return 外网IP
*/
private static String getInternetIp(){
try{
Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
Enumeration<InetAddress> addrs;
while (networks.hasMoreElements())
{
addrs = networks.nextElement().getInetAddresses();
while (addrs.hasMoreElements())
{
ip = addrs.nextElement();
if (ip != null
&& ip instanceof Inet4Address
&& ip.isSiteLocalAddress()
&& !ip.getHostAddress().equals(INTRANET_IP))
{
return ip.getHostAddress();
}
}
}
// 如果没有外网IP,就返回内网IP
return INTRANET_IP;
} catch(Exception e){
throw new RuntimeException(e);
}
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。