主机上有多个网卡用java指定获取某一个网卡ip的问题

前几天写过一个基于tomcat发邮件修改密码的功能,大致是这样:
点击修改密码按钮就发送一封邮件去指定账户的邮箱,邮箱里有个超链接和验证码,超链接打开进入修改密码页面。之前能用,但是今天我的笔记本打开了猎豹免费wifi,造成有两个网卡都被激活,如下图:
主机上有多个网卡用java指定获取某一个网卡ip的问题_第1张图片


发给邮箱的超链接的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地址。先把问题留在这里。以后找到解决办法再来更新

你可能感兴趣的:(java)