Java获取客户端真实IP地址过程解析
这篇文章主要介绍了Java获取客户端真实IP地址过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
业务背景
服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等拦截,在进行IP限定的时候就需要获取客户端真实的IP。
基础知识
访问服务端的方式一般分为两种:
未经过代理,直接访问服务器端;
通过多级代理,最终到达服务器端(nginx,squid,haproxy)。
客户端请求信息都包含在HttpServletRequest中,对于第一种访问方式可以通过getRemoteAddr()方法获得客户端真实IP,而另一种则行不通,但是可以通过x-forwarded-for获得转发后请求信息。当客户端请求被转发时,IP将会追加在其后并以英文逗号隔开,例如:10.47.103.13,4.2.2.2,10.96.112.230。
请求中的参数:
request.getHeader("x-forwarded-for"):10.47.103.13,4.2.2.2,10.96.112.230 request.getHeader("X-Real-IP"):10.47.103.13 request.getRemoteAddr():10.96.112.230
客户端访问经过转发,IP将会追加在其后并以逗号隔开。最终准确的客户端信息为:
- x-forwarded-for不为空,则为逗号前第一个IP;
- X-Real-IP不为空,则为该IP;
- 否则为getRemoteAddr();
相关请求头的解释:
X-Forwarded-For记录一个请求从客户端出发到目标服务器过程中经历的代理,或者负载平衡设备的IP。这是由缓存代理软件Squid引入,用来表示HTTP请求端真实IP,现在已经成为事实上的标准,被各大HTTP代理、负载均衡等转发服务广泛使用,并被写入RFC7239(ForwardedHTTPExtension)标准之中。格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器的ip。现在大部分的代理都会加上这个请求头。
Proxy-Client-IP/WL-Proxy-Client-IP这个一般是经过apachehttp服务器的请求才会有,用apachehttp做代理时一般会加上Proxy-Client-IP请求头,而WL-Proxy-Client-IP是他的weblogic插件加上的头。
HTTP_CLIENT_IP有些代理服务器会加上此请求头。
X-Real-IPnginx代理一般会加上此请求头。
获取客户端真实IP地址
源码:
/** *获取客户端的IP地址
*注意本地测试访问项目地址时,浏览器请求不要用localhost,请用本机IP;否则,取不到IP * *@authoreast7 *@date2019年12月03日 *@returnString真实IP地址 */ publicstaticStringgetClientIpAddress(HttpServletRequestrequest){ //获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 StringheaderName="x-forwarded-for"; Stringip=request.getHeader(headerName); if(null!=ip&&ip.length()!=0&&!"unknown".equalsIgnoreCase(ip)){ //多次反向代理后会有多个IP值,第一个IP才是真实IP,它们按照英文逗号','分割 if(ip.indexOf(",")!=-1){ ip=ip.split(",")[0]; } } if(checkIp(ip)){ headerName="Proxy-Client-IP"; ip=request.getHeader(headerName); } if(checkIp(ip)){ headerName="WL-Proxy-Client-IP"; ip=request.getHeader(headerName); } if(checkIp(ip)){ headerName="HTTP_CLIENT_IP"; ip=request.getHeader(headerName); } if(checkIp(ip)){ headerName="HTTP_X_FORWARDED_FOR"; ip=request.getHeader(headerName); } if(checkIp(ip)){ headerName="X-Real-IP"; ip=request.getHeader(headerName); } if(checkIp(ip)){ headerName="remoteaddr"; ip=request.getRemoteAddr(); //127.0.0.1ipv4,0:0:0:0:0:0:0:1ipv6 if("127.0.0.1".equals(ip)||"0:0:0:0:0:0:0:1".equals(ip)){ //根据网卡取本机配置的IP InetAddressinet=null; try{ inet=InetAddress.getLocalHost(); }catch(UnknownHostExceptione){ e.printStackTrace(); } ip=inet.getHostAddress(); } } logger.info("getClientIpIPis"+ip+",headerName="+headerName); returnip; } privatestaticbooleancheckIp(Stringip){ if(null==ip||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ returntrue; } returnfalse; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。