获取访问者真实ip地址?我觉得不可能
我们真的能通过请求来获取用户真实的ip地址嘛?
答案是不能,如果能,肯定是我学的不够深入,欢迎交流指正。
那么写这篇文章的意义是什么?我们接着往下看。
IP地址相当于电脑在网络上的身份证,但事实上IP地址却没有想象中那么简单,IP也分很多种,比如经常提到内网IP和外网IP。
外网ip和内网ip的区别是什么?
因为这个网络太复杂,讲解时牵扯到的东西太多,没法简单地描述,长篇大论对初学者是极不友好的;如果非要简单地讲解又必然会有遗漏,可能会对你以后产生误导。
我自己也对这个是比较模糊的,我就按照自己的理解大概解释一遍。但是我讲的不一定是对的。
我家里的路由器是电信的,路由器上面连接一根电信的电话线,这跟电话线是要我家去电信缴费,才能上网。我家路由器能上网之后,就能打开wifi,我的其他设备就能通过wifi连接上这台路由器。
上面介绍了个大概,接下来说说java端如何获取访问者 IP ?,先上代码
@Slf4j
public class IpUtil { /**
* 获取用户ip地址
*
* @param request 请求
* @return ip地址
*/
public static String getIpAddr(HttpServletRequest request) { String ipAddress = request.getHeader("X-Original-Forwarded-For");
log.info("X-Original-Forwarded-For:获取的ipAddress{}",ipAddress); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("X-Forwarded-For");
log.info("X-Forwarded-For:获取的ipAddress{}",ipAddress);
}
// 对于通过多个代理的情况,因为ip长度最大为15,如果超过了15就代表有1个以上的ip,这时我们就取第一个,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) {
log.info("多个ip情况:获取的ipAddress:{}",ipAddress);
if (ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
} if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
// apache http服务器的请求
ipAddress = request.getHeader("Proxy-Client-IP");
log.info("Proxy-Client-IP:获取的ipAddress{}",ipAddress);
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
// apache http服务器的请求,使用weblogic插件加上的头
ipAddress = request.getHeader("WL-Proxy-Client-IP");
log.info("WL-Proxy-Client-IP:获取的ipAddress{}",ipAddress);
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
// 有些代理服务器会加上此请求头
ipAddress = request.getHeader("HTTP_CLIENT_IP");
log.info("HTTP_CLIENT_IP:获取的ipAddress{}",ipAddress);
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
log.info("HTTP_X_FORWARDED_FOR:获取的ipAddress{}",ipAddress);
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
// nginx代理服务器会加上此请求头
ipAddress = request.getHeader("X-Real-IP");
log.info("X-Real-IP:获取的ipAddress{}",ipAddress);
} // 没有使用代理的情况
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
log.info("request.getRemoteAddr()------->{}",ipAddress);
} // 如果用localhost来访问会返回0:0:0:0:0:0:0:1,这里我们将它转换为127.0.0.1
return "0:0:0:0:0:0:0:1".equals(ipAddress)?"127.0.0.1":ipAddress;
} }
这段代码看起来很长,其实有用的部分就是 request.getRemoteAddr();
其他情况,都是根据目前常用的代理商使用的请求头类型来获取ip地址。
比如以下几种情况:
X-Original-Forwarded-For
Proxy-Client-IP
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
这些都是一些常用的,因为这个请求头类型是可以自定义的,所以我们根据请求头类型获取ip地址是不现实的。
但是为什么代码里面要写呢?人情世故嘛,万一公司是按代码行数算工资的呢。哈哈,开个玩笑,已知的代理请求头,我们还是需要写上去的。
不结合客户使用场景的光讨论技术都是耍流氓。下面我们重点说一下使用场景。
1、上面那段代码部署在外网环境,那么获取到的就是外网的ip,要是别人没有经过伪装,恭喜你,成功拿到他的ip。要是别人特意伪装,你拿到这个ip或许是假的,没有任何意义。
2、上面那段代码部署在内网环境,那么获取到的就是内网ip,这个内网ip,就能查出具体某台电脑,也能在内网中远程控制你的电脑。
上面两个场景都是人畜无害。
一般是第二种情况使用的多。
比如你的公司有20层,公司所有员工都是用内网,你在20楼,你的同事在1楼,恰好你们公司没有电梯,此时你想控制他的电脑,帮她处理一些事情,你就可以让她直接访问那段代码,获取到她的ip地址。当然,代码肯定是封装成一个接口,不然妹子怎么访问。
什么?远程不用向日葵?TV?QQ?
哈哈,是我格局小了。
什么?直接叫妹子从电脑查看ip地址发给我?
哈哈,是我格局小了。我就怕妹子不会看啊。
难不成让她自己百度怎么查看ip地址?老实说,有这种想法的是不是还单身?
好了,对于获取ip地址,网上也是各种形形色色,但是要明确使用场景,如果你真的想通过一个ip地址去追寻到一个人或者一台电脑,在公网环境下,有点不现实。但是在内网环境中,这个确实可行。
获取访问者真实ip地址?我觉得不可能的更多相关文章
- 获取客户端真实IP地址
Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...
- 伪造IP及获取客户端真实IP地址
Fiddler支持自定义规则,可以实现对HTTP请求数据发送给Server前或HTTP应答数据发送给浏览器前进行修改.下面的例子将演示如何向所有HTTP请求数据中增加一个头.1)打开Fiddler,点 ...
- Java中使用HttpRequest获取用户真实IP地址端口
import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author X-rapido * ...
- Java获取客户端真实IP地址
Java代码 import javax.servlet.http.HttpServletRequest; /** * 获取对象的IP地址等信息 */ public class IPUtil { /** ...
- Java 获取客户端真实IP地址
本文基于方法 HttpServletRequest.getHeader 和 HttpServletRequest.getRemoteAddr 介绍如何在服务器端获取客户端真实IP地址. 业务背景 服务 ...
- java如何获取访问真实IP地址?
java如何获取访问真实IP地址 解决方法: 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址,如果没有代理,则获取真实ip public static String getIp( ...
- 7个获取访问者真实IP的方法,速学!!!
通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有CDN.WAF.高防.例如,采用这样的架构:“用户 > CDN/WAF/高防 > 源站服务器” .那么,在经过多层代 ...
- CDN下nginx获取用户真实IP地址
随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户 ...
- LNAMP架构中后端Apache获取用户真实IP地址的2种方法(转)
一.Nginx反向代理配置: 1.虚拟主机配置 复制代码代码如下: location / { try_files $uri @apache;} location @apache {interna ...
随机推荐
- Git的安装和配置 -入门
Git的版本有很多种,适应各种windows,IOS, Linux平台的安装. 我用的是linux Centos7的版本: 1. 安装命令用Yum, 非常简单就可以安装完毕. yum install ...
- ajax和springmvc的请求响应原理——深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法
1,四大重要部分: 请求链接 post请求和get请求 请求参数形式 响应内容形式 2,从springmvc的controller角度,controller能接收到请求的前提 请求链接必须对应 pos ...
- Python+Requests+Bs4(解析)爬取某诗词信息(数据分析二)
1.环境安装 - 需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个 ...
- 记一次错误:mid=front+(rear-front)>>1;
设rear=6,front=4,mid=front+(rear-front)>>1; mid应该等于5的,但结果却是3. 错误原因:"+"运算符的优先级高于" ...
- 重新手写一个Vue
该版把上一次的数据修改就更新全部页面改为了局部更新,相比于上一版的在数据绑定上不是简单的一个监听set再全部更新,具体见下文. 总体流程 仍然是根据自己理解来实现的绑定,相较于上一版的数据更新就全部刷 ...
- P6753 [BalticOI 2013 Day1] Ball Machine
P6753 [BalticOI 2013 Day1] Ball Machine 题意 给你一个树,每次从根节点放一个求,如果其子节点有空这个球会向下滚,若有多个节点为空则找儿子中以子树内编号的最小值为 ...
- 为什么每次下载后必须关闭掉IO流(十五)
读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用,这是为什么呢? java是从c++设计来的,但是无论是C语言还是C++,都需要手动释放内存,j ...
- Allure测试框架 python
关于Allure Allure是一个report框架,可以基于一些测试框架生成测试报告,比较常用的一般是Junit/Testng框架: Allure 生成的报告样式简洁美观,同时又支持中文: Allu ...
- SAS 常用字符串函数
原文链接:https://www.cnblogs.com/snoopy1866/p/15085466.html CAT(item-1 <, -, item-n>) : 在保留首尾空格的情况 ...
- 开源与Saas,如何选择软件?
随着云计算的发展和普及,在云上使用软件已经成为了主流,为了帮助广大用户理解,我在这里对云上软件的三种主要形态以及如何做出选择做一个简单的分析. 开源免费软件 绝大部分开源软件都是免费的,免费的出发点有 ...