springboot获取用户ip
springboot,或者spring,通过HttpServletRequest获取请求者ip,通过方法即可,但是该方法获取的不全是用户的ip地址,如果请求通过第三方转发或者重定向,获取的就不是需求的ip。
·
springboot获取用户ip
简介:springboot,或者spring,通过HttpServletRequest获取请求者ip,通过 request.getRemoteAddr()
方法即可,但是该方法获取的不全是用户的ip地址,如果请求通过第三方转发或者重定向,获取的就不是需求的ip。
1. 获取请求源IP
之前在前后端分离项目中,前端更换https后,后端没有配置https,就通过nginx代理转发,将https请求转发到http,使得前端能正常访问后端。
然后在后端日志记录中,发现获取请求ip地址全变成nginx服务器的ip,然后查证后,是request.getRemoteAddr()方法的问题。遂将获取ip的代码更改为
/**
* request.getRemoteAddr() 配置Nginx转发后获取不到原来IP,试下这样获取IP
*/
public String getIpAddress(HttpServletRequest request) throws UnknownHostException {
String ip = request.getHeader("X-Forwarded-For");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
// apache 代理添加的请求头
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
// weblogic 代理添加的请求头
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
// 某些代理服务器的请求头
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
// 某些代理服务器的请求头
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
//根据网卡取本机配置的IP
InetAddress inet = InetAddress.getLocalHost();
ip = inet.getHostAddress();
}
}
if (ip.contains(",")) {
ip = ip.split(",")[0];
}
return ip;
}
2. 配置代理服务器nginx
像我通过nginx代理转发,需要在转发的配置中添加转发源的ip,配置如下
location /api/ {
## 设置转发源IP,告诉目标服务经过了路由转发,可以不配置,但是建议配置,对后端获取源IP友好
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
## 转发目的网址
proxy_pass http://yourservername:8003/;
}
然后重启nginx配置。
这样后端通过上面的getIpAddress()方法即可获取到源ip。
另外,这种方式只能获取合规的ip,如果请求者恶意伪装ip,那些通过其他技术手段更改请求ip的,还是无法获取到请求者真实ip
至此,全篇结束

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)