发布时间: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")
这样就明白了吧。
BIGEMAP离线地图服务器(离线地图开发者工具) v15.4.0.0 破解版
48.9M
windows server 2016(服务器操作系统)中文版
5.18G
LabVIEW 2018注册机下载 v1.2绿色版 附激活方法
552 KB
cutterman(附安装使用方法) v3.2.0 免费版
1.3M
tftpd32(网络服务包) V32.452 官方版
0.52MB
金舟视频格式转换器 v3.8.8 电脑版 (附使用方法)
44.15M
NewFileTime(文件时间修改软件) v3.99 中文版
186KB
即时通(即时聊天工具)1.5官方版
1.12MB
咪咪桌面时钟下载
2.72MB
数字时钟下载
22KB
电脑报时下载
1.97 MB
51彩虹下载
11.8M
AnyMP4 Blu-ray RIPper下载
1.7M
FileZilla Server中文版 v0.9.60.0
2.14 MB
HeidiSQL下载
10.1M
Muse CC 2017破解版
1.71MB
NetSetMan下载
4.24MB
TIPard Blu-ray Converter(蓝光视频转换器)v10.0.52 免费版
65.2M
TIPard DVD RIPper下载
67.8M
TIPard Video Converter下载
111.7M
2020-04-22
如何在联想官网上注册我的电脑以及个人信息
笔记本无法连接CMCC-EDU无线的解决思路
Win7系统,登陆系统提示group policy client服务未能登陆拒绝访问
Docker命令行参考(21) – docker logs获取容器的日志
Nginx配置basic_auth密码验证
Windows 8系统如何关闭家庭组降低硬盘读写频率
Linux CentOS7防火墙firewalld使用说明
利用denyhosts防止服务器被ssh暴力破解
在WIN10上使用cmd窗口命令编译Android OpenCV