问题原因
今天使用request.getRemoteAddr()获取客户端地址时,得到了0:0:0:0:0:0:0:1的结果:
网上搜索的大部分解决方案为:
修改C:\Windows\System32\drivers\etc\hosts文件的配置,将 # ::1 localhost 这一句话注释或者删除就行
Notepad打开文件后发现内容已经全部注释,删除最后一行重新启动Tomcat服务器,输出结果仍然为0:0:0:0:0:0:0:1,该方法无效。进一步搜素资料发现 localhost==127.0.01(IPv4)等价于0:0:0:0:0:0:0:1(IPv6),也就是说如果服务器与客户端同时部署在本机,访问时是通过 localhost 来访问,用java获取客户端的IP地址可能会出现该问题,这时用 request.getRemoteAddr()方法获取的IP地址将是: 0:0:0:0:0:0:0:1,在通过了 Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
问题解决
打开cmd输入ipconfig命令:
既然通过此方式即可查看IPV4地址,那么便可以通过java调用CMD获取真实IP地址,编写getIp类:
import java.io.*;
public class getIp {
public static String getLocalIPForCMD() {
StringBuilder sb = new StringBuilder();
String command = "cmd.exe /c ipconfig | findstr IPv4"; // 管道命令
try {
Process p = Runtime.getRuntime().exec(command); // 执行命令
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); // 包装缓冲输入流
String line = null;
while((line = br.readLine()) != null){ //循环读取
line = line.substring(line.lastIndexOf(":")+2,line.length()); //截取IPV4地址
sb.append(line);
}
br.close(); // 字符流关闭
p.destroy(); // 进程销毁
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString(); // 返回IPV4地址
}
public static void main(String args[]) {
System.out.print(getLocalIPForCMD()); //测试
}
}
运行结果:
其中`
String command = "cmd.exe /c ipconfig | findstr IPv4"; // 管道命令
为CMD的批处理语句:
& 顺序执行多条命令,而不管命令是否执行成功
&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令)
| 管道命令 前一个命令的执行结果输出到后一个命令 如:help|more
line = line.substring(line.lastIndexOf(":")+2,line.length()); //截取IPV4地址
line.lastIndexOf(":")这个方法很妙,通过字符串截取,把IP地址从字符串 " IPv4 地址 . . . . . . . . . . . . : 10.3.73.25" 截取出来。
然后在初始化的时候判断ip地址是否为0:0:0:0:0:0:0:1,是的话就调用getIp类的getLocalIPForCMD()方法就行:
至此问题完美解决
以上代码使用JDK1.8,Eclipse for javaee编译器,Tomcat服务器运行成功,如有错误或描述不当请多多指出。
觉得有用就点个赞呗~