Java-获取真实用户ip
1 import common.util.StringUtil; 2 import org.springframework.web.bind.annotation.ModelAttribute; 3 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.http.HttpSession; 7 8 public class BaseController { 9 protected HttpServletRequest request; 10 protected HttpServletResponse response; 11 protected HttpSession session; 12 13 @ModelAttribute 14 public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) { 15 this.request = request; 16 this.response = response; 17 this.session = request.getSession(); 18 } 19 /** 20 * 使用nginx反向代理后获取请求端真实IP 21 * @return 22 */ 23 public String getClientIP() { 24 String ip = request.getHeader("X-Forwarded-For"); 25 if(!StringUtil.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)){ 26 //优先考虑多重代理的情况,应该取第0位的ip值 27 System.out.println("ip=>"+ip); 28 ip = ip.split(", ")[0]; 29 System.out.println("ip==>"+ip); 30 31 } 32 if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { 33 //目前没有遇到多重代理,一般在X-Real-IP中就能获得 34 ip = request.getHeader("X-Real-IP"); 35 System.out.println("ip===>"+ip); 36 } 37 if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { 38 ip = request.getRemoteAddr(); 39 System.out.println("ip====>"+ip); 40 } 41 return ip; 42 } 43 }
需要的业务代码继承此类,再在适当处调用其中方法即可;
PS:
1.客户端A调用服务B,服务B调用服务C,若在服务C中以此方法获取真实ip,只能获取服务B的ip,并无法获取客户端A的ip;
2.若想服务C中想获取客户端A的真实ip,则需服务B将客户端A的ip在请求服务C的接口中将客户端A的真实ip填入request
的X-Forwarded-For属性中.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库