请问如何获得服务器ip

wren4255 2013-12-18 09:52:32
request.getRemoteAddr()

好像不好用啊,上网查说是代理什么的

我现在就想取得服务器ip 然后根据ip判断是连接的什么环境
比如ip是130.120.12.12 的时候 是开发环境
请问怎么取IP呢
...全文
221 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
爪哇三郎 2013-12-19
  • 打赏
  • 举报
回复
楼上那些获取ip的判断很啰嗦,同一个条件用了那么多次,无语.
在互联网业务中,很多时候我们需要获取客户端浏览器实际访问的IP地址,但现在很多网友都是通过代理上网的,如果这时我们在java中用request.getRemoteAddr()去或取ip地址,得到的只是客户端使用代理后的ip地址,也有可能是加上代理后几层的ip,
需要注意的是X-Forwarded-For和X-Real-IP都不是http的正式协议头,而是squid等反向代理软件最早引入的,之所以resin能拿到,是因为NGINX里一般缺省都会这么配置转发的http请求:
location / {
proxy_pass http://yourdomain.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
},从X-Forwarded-For的定义来看,ips[0]才是原始客户端ip,如果这个都不是,那拿第二个就更不靠谱了,我们平时检验的时候,可能是直接在内网挂代理去访问的,跟外面网友访问经过的网络路径不一样,后面不停添加的是经过的每一层代理ip才对,下面举例说明;
request.getRemoteAddr() 192.168.239.196
request.getHeader("X-Forwarded-For") 58.63.227.162, 192.168.237.178, 192.168.238.218
request.getHeader("X-Real-IP") 192.168.238.218
所以访问的流程应该是这样,客户端58.63.227.162发出请求,经过192.168.237.178, 192.168.238.218两层转发,到了192.168.239.196这台NGINX上,NGINX就把X-Real-IP头设成了自己看到的remote_addr,也就是直接发给到他的192.168.238.218,这时候resin收到这个包,对resin来说直接发给他的remote_addr就是NGINX的ip,也就是192.168.239.196,那么resin里面的request.getRemoteAddr()就是192.168.239.196,那么在resin里拿最原始的ip逻辑(也就是拿能够知道的最外层的ip)应该是这样:
如果XFF不为空,拿XFF的左边第一个
如果XFF为空,拿XRI
如果XRI为空,只能拿request.getRemoteAddr(),也就是只能拿到最直接 发给他的机器ip了,

  • 打赏
  • 举报
回复
引用 8 楼 wren4255 的回复:
[quote=引用 3 楼 fangmingshijie 的回复:]
public static 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();
		}
		if (ip.equals("0:0:0:0:0:0:0:1")) {
			ip = "localhost";
		}
		return ip;
	}
获取ip是这样获取的
谢谢 不过为什么要多吃次getheader()呢[/quote]你看header头是不一样,是代理还是什么的
wren4255 2013-12-19
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
public static 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();
		}
		if (ip.equals("0:0:0:0:0:0:0:1")) {
			ip = "localhost";
		}
		return ip;
	}
获取ip是这样获取的
谢谢 不过为什么要多吃次getheader()呢
wren4255 2013-12-19
  • 打赏
  • 举报
回复
引用 6 楼 yys79 的回复:
remoteaddr是访问浏览器所在的ip,不是服务器端ip。先说说你取服务器ip要做什么呢
我想根据ip判断连接的是什么环境
帝瓜 2013-12-18
  • 打赏
  • 举报
回复
用request获取浏览器上ip,这是个本方法
致知Fighting 2013-12-18
  • 打赏
  • 举报
回复
可以参考一下我的博客 http://ygydaiaq-gmail-com.iteye.com/blog/1985820
  • 打赏
  • 举报
回复
public static 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();
		}
		if (ip.equals("0:0:0:0:0:0:0:1")) {
			ip = "localhost";
		}
		return ip;
	}
获取ip是这样获取的
致知Fighting 2013-12-18
  • 打赏
  • 举报
回复
那个API是根据host里配置的计算机名来取IP的,实际上如果你要绑定服务的话,是不用取IP的,直接绑定端口就好了,操作系统会把你的服务绑定到服务器上所有对外的网卡上
zhongzi998 2013-12-18
  • 打赏
  • 举报
回复
我用的一个获取ip的笨方法就是访问获取ip的网页,例如ip138,然后再网页源码中截取自身的ip。
loveunittesting 2013-12-18
  • 打赏
  • 举报
回复
remoteaddr是访问浏览器所在的ip,不是服务器端ip。先说说你取服务器ip要做什么呢

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧