java中怎么获取客户端的真实的IP
服务器A被服务器B代理的,怎么能获取客户段的真实IP地址,现在在服务器A上获取的IP地址全是代理服务器B的IP地址,怎么样能获取真实的客户端的IP地址 --------------------编程问答-------------------- -----------以下为LZ Google的在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
--------------------编程问答-------------------- String ip=request.getRemoteAddr(); --------------------编程问答--------------------
LZ这个不错您可以看看
赞一个 --------------------编程问答-------------------- --------------------编程问答-------------------- 代理方式是得不到客户端的地址的。只能得到直接端口号。要是有这技术的话,倒是可以通过查找代理机对应端口号的对应代理客户端ip --------------------编程问答-------------------- http://hi.baidu.com/yuxinglian/blog/item/2a657acedb92f130b600c8bf.html --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 2楼 这位兄弟x114944880说的好啊··
但是我就是你说的那样做的·
下面是我获取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;
}
但问题是还是获取不到真实的IP,还是获取的代理服务器的IP啊·
请问各位大侠问题出在那里啊·? --------------------编程问答-------------------- 以前只知道request.getRemoteAddr(); --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- /**
* 获取客户IP
* @param request
* @return
*/
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;
}
--------------
我也是这样获取的,
你说的是获取客服端IP,这样就是真实的客服端IP
那与服务器代理有什么关系啊。
--------------------编程问答-------------------- 学习了。
不过,真正的“匿名代理”是不会向服务器透露客户端的IP地址的。 --------------------编程问答-------------------- 11楼你确信能获取到真实的IP地址吗?我是已经验证过了,那方法只能获取到代理服务器的IP,获取不到访问者的真实IP
郁闷啊 --------------------编程问答-------------------- 5楼能不能说的清楚点啊··谢谢 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- up --------------------编程问答-------------------- public static String getIpAddr(HttpServletRequest request)
{
String ip = null;
Enumeration enu = request.getHeaderNames();
while (enu.hasMoreElements()) {
String name = (String)enu.nextElement();
if (name.equalsIgnoreCase("X-Forwarded-For")) {
ip = request.getHeader(name);
}
else if (name.equalsIgnoreCase("Proxy-Client-IP")) {
ip = request.getHeader(name);
}
else if (name.equalsIgnoreCase("WL-Proxy-Client-IP")) {
ip = request.getHeader(name);
}
if ((ip != null) && (ip.length() != 0))
break;
}
if ((ip == null) || (ip.length() == 0))
ip = request.getRemoteAddr();
return ip;
}
用这个吧,绝对没问题,除非你的环境是集群的。 --------------------编程问答-------------------- 学习了
--------------------编程问答-------------------- 学习了! --------------------编程问答-------------------- 17 楼的方法我也试了还是不行··服务器是用SSH代理来着··难道真的不能获取真实的IP --------------------编程问答-------------------- 学习中。 --------------------编程问答--------------------
public static String getIpAddr(HttpServletRequest request)
{
String ip = null;
Enumeration enu = request.getHeaderNames();
while (enu.hasMoreElements()) {
String name = (String)enu.nextElement();
if (name.equalsIgnoreCase("X-Forwarded-For")) {
ip = request.getHeader(name);
}
else if (name.equalsIgnoreCase("Proxy-Client-IP")) {
ip = request.getHeader(name);
}
else if (name.equalsIgnoreCase("WL-Proxy-Client-IP")) {
ip = request.getHeader(name);
}
if ((ip != null) && (ip.length() != 0))
break;
}
if ((ip == null) || (ip.length() == 0))
ip = request.getRemoteAddr();
return ip;
}
--------------------编程问答-------------------- 学习了,不过看的云里雾里的 --------------------编程问答-------------------- 来学习的,顶一下 --------------------编程问答-------------------- 顶一下~~~~~~~~~~~~~ --------------------编程问答-------------------- 真的IP在你提交服务器后就已经找不到了,无论是后台,还是在前台,服务器会做一些自我的修改,比如在页面上,如果不经过服务器的话,也就是静态调试页面,用javascript取得的地址就是绝对的地址,可是如果提交到服务器上,同样的javaScript语句得到的是服务器的一个path地址。我本来想从这个地址来回访文件,计算本件的大小的,看为只能放弃了。 --------------------编程问答-------------------- 瞎说,那服务器怎么返回给客户端啊。 --------------------编程问答-------------------- 并没有返回客户端,而是通过 file f=new file(“path”);
然后通过String fileSize=(double)(f.length()/1024/1024)+"M";
得到文件的大小,如果path是绝对地址的话,那么fileSize就是能得到的。比如path="c://dd/f.rar"那么 f.rar的大小就能得到。 --------------------编程问答--------------------
--------------------编程问答-------------------- Java code
public String getIpAddr() {
String ipAddress = null;
ipAddress = request.getRemoteAddr();
ipAddress = request.getHeader("x-forwarded-for");
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
//对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
if(ipAddress.indexOf(",")>0){
ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
}
}
return ipAddress;
}
public String getIpAddr() {
String ipAddress = null;
ipAddress = request.getRemoteAddr();
ipAddress = request.getHeader("x-forwarded-for");
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
//对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
if(ipAddress.indexOf(",")>0){
ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
}
}
return ipAddress;
}
ipAddress = request.getRemoteAddr();
该处就可以获得代理的IP,下面的代码点用都没有
难道就不能获得真实的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();
}
//可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值
//是取X-Forwarded-For中第一个非unknown的有效IP字符串
String[] str = ip.split(",");
if(str!=null && str.length>1){
ip = str[0];
}
return 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();
}
//可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值
//是取X-Forwarded-For中第一个非unknown的有效IP字符串
String[] str = ip.split(",");
if(str!=null && str.length>1){
ip = str[0];
}
return ip;
}
不管是那个方法request.getHeader("x-forwarded-for");
request.getHeader("Proxy-Client-IP");
request.getHeader("WL-Proxy-Client-IP");
这样去获取IP都是为空的
request.getRemoteAddr()这里可以获取到IP,但是就是获取到代理的IP啊·
有人知道为什么不啊?
另外看到一些专门做IP限制的,能穿过代理,获取真实的IP,不知道是什么原理,希望有人赐教,谢谢 --------------------编程问答-------------------- mark --------------------编程问答--------------------
顶了。收藏!! --------------------编程问答-------------------- --------------------编程问答-------------------- 看看能不能够得到网卡的信息 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 以前做项目的时候用过,就不知道为什么这样。
今天楼主让我明白了。谢谢 --------------------编程问答-------------------- --------------------编程问答-------------------- 没看明白 云里雾里
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 学习
--------------------编程问答--------------------
这个牛 --------------------编程问答-------------------- --------------------编程问答-------------------- 最后测试哪个可以用呀。 --------------------编程问答-------------------- 1L研究的这么透彻。。 --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 还没有解决吗? --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 不懂 --------------------编程问答-------------------- 26的方法不知道是否可行,其他的方法都不可能保证能拿到客户端. 如果代理是我们自己开发的. 所以代理发送的请求头文件都不包含客户端的信息 那就肯定拿不到. 有人说拿网卡地址 那就能拿不到啦. 网卡地址是代理服务器的网卡 --------------------编程问答-------------------- 不错,学习了。。。。。。。。。。 --------------------编程问答-------------------- 是不是这种问题要看 RFC 标准里面是如何介绍的? --------------------编程问答-------------------- 不错,学习了。。。。。。。。。。
用的二楼的! --------------------编程问答-------------------- 帖子发了这么久,我现在是弄明白这个服务器之间的代理了。我这里说的代理是指在在两台linux服务器之间,建立一个安装通道,通过这个通道来转发请求,上面各位的答复都不是正确的方法,根本没办法拿到客户到得真实IP。
代理结构图
客户端--》代理服务器--》真实服务器
在代理服务器与真实服务器之间建立一个linux下面的安全通道,代理服务器将客户端的请求转发真实服务器 --------------------编程问答-------------------- 是个问题
--------------------编程问答-------------------- 1楼真实太厉害了 非常正确 谢谢啦 呵呵 --------------------编程问答-------------------- 看了楼上各们的回答,其实得到的都不是网络IP只能得到像192.168.……这样的IP,这没有什么用的。下面可以得到机子在实际网络中的IP.具体怎么能得到客户端的很是个问题,java代码可是运行是服务器上的.
public class GetIPMAC {
String OutPutStream = new String();
int a;
char b;
int power = 1;
String c = null;
String res;
URLConnection urlcon;
public String dayinji(int power, char d) {
if (power == 1) {
res = String.valueOf(d);
} else {
res = "";
}
return res;
}
public String getIP() {
try {
URL url = new URL("http://www.cz88.NET/ip/viewip468.ASPx");
urlcon = url.openConnection();
int i = urlcon.getContentLength();
if (i > 0) {
InputStream isr = urlcon.getInputStream();
InputStreamReader is = new InputStreamReader(isr, "GB2312");
int spower = 0;
while ((a = is.read()) != -1) {
b = (char) a;
OutPutStream = OutPutStream + "" + dayinji(power, b);
c = String.valueOf(b);
if (OutPutStream.indexOf("IPMessage\">") > 0) {
OutPutStream = "";
power = 1;
spower = 1;
}
if (spower == 1) {
if (c.equalsIgnoreCase("<")) {
power = 0;
}
}
}
OutPutStream = OutPutStream.replaceAll(">", "");
OutPutStream = OutPutStream.replaceAll("", "");
OutPutStream = OutPutStream.replaceAll("<", "");
} else {
System.out.println("Length is null.");
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return OutPutStream;
}
} --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 看的云里雾里 --------------------编程问答-------------------- 不错,学习了 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- --------------------编程问答-------------------- 顶一个~~哈哈~~~ --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 多多看看内置对象!
--------------------编程问答-------------------- 好贴 学习了
版主在没 加精吧 --------------------编程问答-------------------- 学习了,好 --------------------编程问答-------------------- 如果是内部应用系统倒是可以考虑用js获取:
<html>
<head>
<script language="javascript">
var MACAddr;
var IPAddr;
var DomainAddr;
var sDNSName;
function valid(){
//获取本机地址信息
document.form1.remoteIPAddr.value = IPAddr;
document.form1.remoteMACAddr.value = MACAddr;
document.form1.remoteName.value = sDNSName;
}
</script>
<script language="javascript" event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true) {
if(objObject.MACAddress != null && objObject.MACAddress != "undefined"){
MACAddr = objObject.MACAddress;
}
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined"){
IPAddr = objObject.IPAddress(0);
}
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined"){
sDNSName = objObject.DNSHostName;
}
}
</script>
</head>
<body>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language="javascript">
var service = locator.ConnectServer();
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>
</body>
</html> --------------------编程问答-------------------- 最后问题怎么解决的? 能不能给个完整的答案. --------------------编程问答-------------------- 网卡 怎么返回0:0:0:0:0:0:0:1
啊?
怎么解决 --------------------编程问答-------------------- --------------------编程问答-------------------- 大家 说的都是一样,还是一个问题,不管怎么样,都是取不到真实的IP,都是代理的IP,寻找答案中。。。。。。。。。。。。 --------------------编程问答-------------------- 唐元舟 非常好,加分 --------------------编程问答-------------------- 长见识了。 --------------------编程问答-------------------- 已有正确答案,在此不再累述 --------------------编程问答-------------------- 学习了。 --------------------编程问答--------------------
同上?! --------------------编程问答-------------------- 我也正在 研究 这个 问题, 怎么样才能 获取 真实IP的?? --------------------编程问答--------------------
补充:Java , Java EE