java获取客户端ip并且解决获取ip为0:0:0:0:0:0:0:1的问题
0:0:0:0:0:0:0:1是ipv6的表现形式,对应ipv4来说相当于127.0.0.1,也就是本机
如果项目部署在本机win7系统,访问时是通过 localhost 来访问,
用java获取ip地址可能会出现该问题,这时获取的ip将是 0:0:0:0:0:0:0:1
要是机器在局域网中,访问时使用自己的ip访问,如 我的ip是 :192.168.123.156
访问url:http://192.168.123.156:8080/test
这时候请求会经过路由器转发,所以服务器获取的就是本机的局域网内ip,在java中获取的ip就是 192.168.123.156了
下面几个获取ip的方法:
public static String getIP(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (!checkIP(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (!checkIP(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (!checkIP(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
private static boolean checkIP(String ip) {
if (ip == null || ip.length() == 0 || "unkown".equalsIgnoreCase(ip)
|| ip.split(".").length != 4) {
return false;
}
return true;
}
X-Forwarded-For 用法以及原理
如果 X-Forwarded-For 获取不到,就去获取X-Real-IP ,X-Real-IP 获取不到,就依次获取Proxy-Client-IP 、WL-Proxy-Client-IP 、HTTP_CLIENT_IP 、 HTTP_X_FORWARDED_FOR 。最后获取不到才通过request.getRemoteAddr()获取IP,
X-Real-IP 就是记录请求的客户端真实IP。跟X-Forwarded-For 类似。
Proxy-Client-IP 顾名思义就是代理客户端的IP,如果客户端真实IP获取不到的时候,就只能获取代理客户端的IP了。
WL-Proxy-Client-IP 是在Weblogic下获取真实IP所用的的参数。
HTTP_CLIENT_IP 与 HTTP_X_FORWARDED_FOR 可以理解为X-Forwarded-For , 因为它们是PHP中的用法。
通过postman伪造X-Forwarded-For以及如何防范,包括上述图片来源,请参考博文:
https://segmentfault.com/a/1190000019197577
request.getRemoteAddr() 获取的值为0:0:0:0:0:0:0:1的原因及解决办法
最近在进行web开发时,在jsp页面获取服务器ip时,遇到了request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1,这是为什么呢,照道理讲,应该是127.0.0.1才对,为什么这个获取的值变成了ipv6了呢,而且我发现这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现),后来上网查了查原因,原来是/etc/hosts这个东西作怪(在windows上应该是C:\Windows\System32\drivers\etc\hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题。另外localhost这个文件很有用,这里你可以添加自己的条目,例如添加 192.168.0.212 myweb 这样子,在浏览器中原来只能使用192.168.0.212来访问的,并可以使用myweb来进行替换。
如果还不能解决,本机访问的时候用127.0.0.1或本机ip代替localhost即可解决
最后在上述代码块中,checkIP()方法中 有一个条件 ip.split(".").length != 4 本人尚未理解,本人理解的 应该把!= 改成==
如有大佬可以解释一下,万分感谢!!!
文中内容均参考自多个博客:
http://blog.csdn.net/leoz0802/article/details/6364565
https://www.iteye.com/blog/java161-1189279
https://segmentfault.com/a/1190000019197577
https://www.jb51.net/article/126931.htm
overitqian: 国土空间规划![表情包](https://g.csdnimg.cn/static/face/emoji/010.png)
![表情包](https://g.csdnimg.cn/static/face/emoji/010.png)
布哩啾啾: 请教一下,stuff内面如你一般有子查询还有for xml path的话一旦数据量几千条查询就开始变很慢,sqlserver版本是2008的,没法使用新函数 string_agg,还有别的优化方法吗?
初—: 调整点1:yml文件中驱动由com.mysql.jdbc.Driver改成com.mysql.cj.jdbc.Driver 调整点2:pom文件添加依赖: <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <!--配置注解执行器配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>[code=java] [/code][code=java] [/code]
water___Wang: