2020-04-10 16:31:12
最近刚刚写好个人电商网站,然后忙于找工作,可是自己的网站我想看到访问人数与访问的ip地址。这样可以了解是否有人看到。
最开始的时候查了一下资料,也没有去想其他的问题,直接就开始写代码了,可是发现写好之后,我在本机进行测试,获取到的ip地址都是127.0.0.1,这是有点疑惑,为什么会出现这种问题。我的代码是这样的。
public String addOrUpdate(HttpServletRequest request){
String ip = request.getRemoteAddr();
return ip;
}
网上查了之后说是我这里使用了代理软件,所以只能获取到本地localhost地址,只能是127.0.0.1
然后 网上给出了两种解决办法
方法一public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
方法二
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
可是经过我的测试两种方法都不管用,不知道是出于什么原因,这时候我在想可能原因在于我使用的nginx设置上面,这个还真在网上找到了答案
nginx配置这里需要添加这样一条location /{
root html;
index index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
然后修改Java代码
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
这样就可以获取到真实的ip地址了
网上查到给出的解释是这样的
我在查阅资料时,有一本名叫《实战nginx》的书,作者张晏,这本书上有这么一段话“经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:
proxy_set_header X-real-ip $remote_addr;
其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:
request.getAttribute("X-real-ip")
这样就明白了吧。
PC-cillin 2007如何设置升级代理服务器
04-10
Docker命令行参考(17) – docker events从服务器获取实时事件
02-14
联想万全R520 G7服务器系统用户手册V1.0
06-08
T270 G5服务器liunx系统运行过程报“nautilus崩溃”错误的原因?
07-18
Zabbix3.0监控Apache2.4服务器状态
07-17
搭建自己的git服务器
07-08
nginx反向代理缓存引发的跨域问题
02-12
docker部署zabbix监控系统(nginx mysql)
06-28
使用fpm工具制作nginx的rpm包
06-26
开启nginx的gzIP压缩功能,节省流量
05-28
OpenResty(nginx Lua)获取nginx Worker CPU使用率
04-27
intel I217-V网卡闲置的时候,会向思科交换机发送大量IPv6网络封包,造成交换机CPU负载过高
06-18
获取Windows 10 兼容性App测试失败
02-19
Docker命令行参考(21) – docker logs获取容器的日志
02-27
F2014A显示器用户手册
06-28
IdeaPad Y460p&Y560p用户手册
07-12
Lenovo G360用户使用手册
07-16
Lenovo G550在Windows XP操作系统下触控板驱动安装方法
07-17
Linux userconf用户帐号设置程序命令详解
06-19
Linux w显示目前登入系统的用户信息命令详解
06-06
C-Lodop云打印服务器(云打印工具)v4.115官方版
9.3M
下载Titan FTP Server(SFTP服务器软件) v19.00.3537 免费版
50.1M
下载MathWorks MATLAB R2019a破解补丁 附使用方法
18.61GB
下载cutterman(附安装使用方法) v3.2.0 免费版
1.3M
下载msvcr80.dll丢失怎么办 64位/32位 附丢失解决方法
234 KB
下载powerstrIP 3.90中文破解版 (附使用方法)
1.28MB
下载金舟视频格式转换器 v3.8.8 电脑版 (附使用方法)
44.15M
下载即时通下载
1.12MB
下载咪咪桌面时钟(桌面时钟合集) v3.7.7.0 官方版
2.72MB
下载嘟嘟语音(即时通信软件) v3.2.282.0 免费版
73.2M
下载定时关机3000下载
7.12M
下载数字时钟下载
22KB
下载欢乐吧多人视频聊天(即时聊天工具) v5.971 免费版
14MB
下载电脑报时(电脑整点报时工具) V1.1 免费版
1.97 MB
下载IPcamera下载
3.1M
下载IPscan(zIP文件查看器)v1.2 官方版
116.3K
下载AnyMP4 Blu-ray RIPper下载
1.7M
下载Emby Server下载
101M
下载FileZilla Server
2.14 MB
下载HeidiSQL下载
10.1M
下载