主機上有多個網絡卡用java指定獲取某一個網絡卡ip的問題
阿新 • • 發佈:2019-02-03
前幾天寫過一個基於tomcat發郵件修改密碼的功能,大致是這樣:
點選修改密碼按鈕就傳送一封郵件去指定賬戶的郵箱,郵箱裡有個超連結和驗證碼,超連結開啟進入修改密碼頁面。之前能用,但是今天我的筆記本打開了獵豹免費wifi,造成有兩個網絡卡都被啟用,如下圖:
發給郵箱的超連結的ip地址是通過InetAddress.getLocalHost().getHostAddress()獲取,此時得到的是專用網路的ip地址,而我的tomcat是在公用網路上執行的,兩個ip不一致,此超連結無法跳轉到修改密碼頁面。然後我直接寫了一次測試類發現,在我筆記本上用這個方法獲取的ip地址為免費wifi啟用的專有網路地址,把免費wifi關掉之後就能取到公用網路即(乙太網)的ip地址。
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;
public class test {
public static void main(String[] args) throws UnknownHostException {
System.out.println("本機IP地址為:" +InetAddress.getLocalHost().getHostAddress());
}
}
研究了一上午,寫了一個方法可獲取到本機的所有的IP。
public static InetAddress getLocalHostIp() throws SocketException{
Enumeration allNetInterfaces=NetworkInterface.getNetworkInterfaces();
InetAddress ip=null;
while(allNetInterfaces.hasMoreElements()){
NetworkInterface netInterface=(NetworkInterface) allNetInterfaces.nextElement();
//System.out.println(netInterface.getName());
Enumeration addresses=netInterface.getInetAddresses();
while(addresses.hasMoreElements()){
ip=(InetAddress) addresses.nextElement();
if(ip!=null && ip instanceof Inet4Address){
System.out.println("本機的ip="+ip.getHostAddress());
break;
}
}
}
return ip;
}
但還是沒有辦法指定獲取哪個ip地址。先把問題留在這裡。以後找到解決辦法再來更新