当前位置:编程学习 > JAVA >>

请问如何获得服务器ip

request.getRemoteAddr()

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

我现在就想取得服务器ip 然后根据ip判断是连接的什么环境
比如ip是130.120.12.12 的时候 是开发环境 
请问怎么取IP呢 --------------------编程问答-------------------- 我用的一个获取ip的笨方法就是访问获取ip的网页,例如ip138,然后再网页源码中截取自身的ip。 --------------------编程问答-------------------- 那个API是根据host里配置的计算机名来取IP的,实际上如果你要绑定服务的话,是不用取IP的,直接绑定端口就好了,操作系统会把你的服务绑定到服务器上所有对外的网卡上 --------------------编程问答--------------------
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是这样获取的 --------------------编程问答-------------------- 可以参考一下我的博客
http://ygydaiaq-gmail-com.iteye.com/blog/1985820 --------------------编程问答-------------------- 用request获取浏览器上ip,这是个本方法 --------------------编程问答-------------------- remoteaddr是访问浏览器所在的ip,不是服务器端ip。先说说你取服务器ip要做什么呢 --------------------编程问答--------------------
引用 6 楼 yys79 的回复:
remoteaddr是访问浏览器所在的ip,不是服务器端ip。先说说你取服务器ip要做什么呢


我想根据ip判断连接的是什么环境 --------------------编程问答--------------------
引用 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()呢 --------------------编程问答--------------------
引用 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()呢
你看header头是不一样,是代理还是什么的 --------------------编程问答-------------------- 楼上那些获取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了,

补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,