服务器A被服务器B代理的,怎么能获取客户段的真实IP地址,现在在服务器A上获取的IP地址全是代理服务器B的IP地址,怎么样能获取真实的客户端的IP地址?
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.bt285.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.5q520.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off 则:X-Forwarded-For: unknown
于是可得出获得客户端真实IP地址的方法二:
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;
}
可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110
分享到:
相关推荐
### Java获取客户端真实IP的两种方法详解 #### 一、问题背景 在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求...
### Java获取客户端真实IP地址详解 在Web开发中,获取客户端的真实IP地址是一个常见的需求,尤其是在需要进行地理位置定位、安全审计、流量统计等场景下。然而,在存在反向代理服务器的环境中,传统的`request....
Java中获取客户端的真实IP
可以通过java获取客户端IPMAC主机名等信息。下载就能用,欢迎下载!
如果需要获取真实的客户端IP地址,还需要检查HTTP头部信息中的`X-Forwarded-For`字段。 #### 二、获取客户端 MAC 地址 获取客户端的MAC地址相对较为复杂,一般不推荐直接在Web应用中实现该功能。但在某些特定场景...
在上面的代码中,首先通过x-forwarded-for请求头获取客户端IP地址,然后将其分割以获取第一个IP地址,哪个就是客户端真实IP地址。 此外,还有其他方法可以获取客户端真实IP地址,例如通过Proxy-Client-IP、WL-Proxy...
在Web开发过程中,有时候我们需要获取客户端的真实IP地址,特别是在涉及到用户地理位置定位、安全控制等场景时尤为重要。然而,在实际应用中,很多情况下用户的请求会经过反向代理服务器(如Nginx、Squid等),这...
### Java 获取客户端 IP 地址 在 Web 开发中,获取客户端 IP 地址是一项非常重要的功能,尤其是在需要记录用户活动、实现地理位置定位...以上就是关于如何在 Java 中获取客户端 IP 地址及 MAC 地址的相关知识点介绍。
Java获取客户端真实IP Java面试中获取客户端真实IP是非常重要的一环,今天我们就来探讨如何在Java中获取客户端的真实IP。 首先,我们需要了解为什么需要获取客户端的真实IP。在进行一些小游戏开发时,分享功能是一...
2. **获取客户端IP地址**:在Web应用中,服务器需要区分每个客户端,`IpUtils`可能会有方法处理`HttpServletRequest`对象,从HTTP请求头(如`X-Forwarded-For`或`RemoteAddr`)中解析出真实客户端的IP地址。...
在Controller类获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用...
3. **注意安全性**:虽然"X-Forwarded-For"通常被用来获取真实的客户端IP,但它的值可以被客户端篡改,因此在生产环境中,不应完全依赖此头字段,而是结合其他安全措施,如验证服务器的日志或使用更安全的协议。...
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将...
在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等...
在IT行业中,尤其是在Web开发领域,获取客户端的IP地址是一项常见的任务。这有助于跟踪用户行为、提供地域针对性的服务,甚至进行安全防护。本篇文章将详细解释如何在Java环境下,通过Servlet和Reactive编程模型来...
java代码实现 服务器端获取客户端的真实IP(亲测可用)
获取客户端IP地址、浏览器版本和操作系统信息在JSP中的实现方法 在JSP中,获取客户端的IP地址、浏览器版本和操作系统信息是非常重要的。通过使用HttpServletRequest对象,我们可以获取到客户端的相关信息。 获取...
在Java编程中,获取客户端IP地址以及其归属地是一项常见的...以上就是Java获取客户端IP及IP归属地涉及的主要技术点。在实际项目中,你需要结合项目需求,选择合适的方法来实现这一功能,同时考虑性能、隐私保护等因素。
首先,我们需要了解在Java Web应用中获取客户端IP地址的基本方法。通常,在Servlet环境下,可以通过HttpServletRequest对象的getRemoteAddr()方法来获取。然而,在某些情况下,如通过反向代理服务器(如Nginx、...