获取客户端真实IP地址

1、需要引入log4j-1.2.14.jar

package org.ydd.test;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

/**
 * @author coco
 * @version
 * 获取IP4
 */
public class IP4 {
	private static final Logger log = Logger.getLogger(IP4.class);
	/**
	 * 获取客户端真实IP地址(注意:如果通过Squid反向代理软件,需更改squid.conf配置文件forwarded_for项默认是为on,
	 * 否则获取到的IP为unknown)
	 * @param request
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public  static String getIpAddr(HttpServletRequest request) {
	log.debug("====================================================");

	if(log.isDebugEnabled()){
	StringBuffer buf = new StringBuffer("all head info:\n");
	Enumeration enumeration = request.getHeaderNames();
	while(enumeration.hasMoreElements()){
	Object head = enumeration.nextElement();
	if(null != head){
	String value = request.getHeader(String.valueOf(head));
	buf.append(head + "=" + value + "\n");
	}
	}
	log.debug(buf.toString());
	}

	String ip = request.getHeader("x-forwarded-for");
	log.debug("request.getHeader(\"x-forwarded-for\")=" + ip);

	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	ip = request.getHeader("X-Forwarded-For");
	log.debug("request.getHeader(\"X-Forwarded-For\")=" + ip);
	}

	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	ip = request.getHeader("Proxy-Client-IP");
	log.debug("request.getHeader(\"Proxy-Client-IP\")=" + ip);
	}

	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	ip = request.getHeader("WL-Proxy-Client-IP");
	log.debug("request.getHeader(\"WL-Proxy-Client-IP\")=" + ip);
	}

	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	ip = request.getHeader("HTTP_CLIENT_IP");
	log.debug("request.getHeader(\"HTTP_CLIENT_IP\")=" + ip);
	}

	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	ip = request.getHeader("HTTP_X_FORWARDED_FOR");
	log.debug("request.getHeader(\"HTTP_X_FORWARDED_FOR\")=" + ip);
	}

	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	ip = request.getRemoteAddr();
	log.debug("request.getRemoteAddr()=" + ip);
	}

	if(null != ip && ip.indexOf(',') != -1){
	//如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串 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
	//注意:当访问地址为 localhost 时 地址格式为 0:0:0:0:0:0:1
	log.debug("ip=" + ip);
	String[] ips = ip.split(",");
	for (int i = 0; i < ips.length; i++) {
	if(null != ips[i] && !"unknown".equalsIgnoreCase(ips[i])){
	ip = ips[i];
	break;
	}
	}
	if("0:0:0:0:0:0:1".equals(ip)){
	log.warn("由于客户端访问地址使用 localhost,获取客户端真实IP地址错误,请使用IP方式访问");
	}
	}

	if("unknown".equalsIgnoreCase(ip)){
	log.warn("由于客户端通过Squid反向代理软件访问,获取客户端真实IP地址错误,请更改squid.conf配置文件forwarded_for项默认是为on解决");
	}
	log.debug("====================================================");
	return ip;
	}
}
时间: 2024-10-13 02:45:16

获取客户端真实IP地址的相关文章

asp网络编程:ASP如何获取客户端真实IP地址

要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取.不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的IP.还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用 Request.ServerVari

Java获取客户端真实IP地址

1 public String getIpAddr(HttpServletRequest request) { 2 String ip = request.getHeader("x-forwarded-for"); 3 if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 4 ip = request.getHeader("Proxy-Client-IP");

PHP获取用户真实IP地址

PHP获取客户端真实IP地址方法 在PHP获取客户端IP中常使用 $_SERVER["REMOTE_ADDR"] . (1) 但如果客户端是使用代理服务器来访问,那取到的是代理服务器的 IP 地址,而不是真正的客户端 IP 地址.要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取. (2) 但只有客户端使用“透明代理”的情况下,$_SERVER["HTTP_X_FORWARDE

C#获得当前页面客户端的IP 用于监测获取某个页面上用户的客户端真实IP地址

C#获得当前页面客户端的IP 用于监测获取某个页面上用户的客户端真实IP地址  1 /// <summary> 2 /// 获得当前页面客户端的IP 3 /// </summary> 4 /// <returns>当前页面客户端的IP</returns> 5 public static string GetIP() 6 { 7 8 9 string result = String.Empty; 10 11 result = HttpContext.Curre

nginx在varnish后端做负载均衡,后端tomca获取客户端真实IP

nginx在varnish后端做负载均衡,后端tomca获取客户端真实IP 1.设置nginx配置文件    首先要确定nginx做负载均衡,在安装时把http_realip_module 安装上了.    查看方法: /usr/local/nginx/sbin/nginx -V   配置nginx.conf    vim /usr/local/nginx/conf/nginx.conf   加入 set_real_ip_from 192.168.88.131;      重新加载nginx:

获取客户端真实IP——request.getHeader(&quot;x-forwarded-for&quot;)

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP地址了.如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP. 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过

socket.io获取客户端的IP地址(修正官方1.0.4版本BUG)

之前我有看过别人写的文章,说到如何获取客户端IP地址,代码如下: var io = require("socket.io").listen(server); io.sockets.on("connection", function (socket) { var address = socket.handshake.address; console.log("New connection from " + address.address + &qu

解决haproxy代理nginx获取客户端真实ip问题

问题背景: 我们公司之前由于DDOS攻击导致网络出口受影响,经过了解,流量进入亚马逊是不收钱的,而且不限流量,为了加强防范网络攻击对业务造成影响,在亚马逊部署一套haproxy代理,把部分业务迁移试用. 为了使用nginx能获取到客户端的ip地址,在haproxy中配置option httpclose和option forwardfor,nginx配置set_real_ip_from x.x.x.x;和real_ip_header X-Forwarded-For;(其中x.x.x.x是hapro

Java正确获取客户端真实IP方法整理

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.abc.com/的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP