完美解决JSP通过getRemoteAddr()方法获取客户端地址为IPV6: 0:0:0:0:0:0:0:1的问题

问题原因

今天使用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服务器运行成功,如有错误或描述不当请多多指出。

觉得有用就点个赞呗~

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值