用户登录IP记录问题

紫轩阡陌 发布于 2013/05/02 11:42
阅读 627
收藏 0
想知道大家在记录用户登录IP的时候都是怎么处理的,我现在需要记录的是用户当时登录用的外网IP,用户环境比较复杂,有各种专线、代理的,怎样才能记录到正确真实的IP
加载中
0
景愿
景愿
相信1L的办法无法解决楼主的问题,而且我也不知道如何做!
0
ITFrank
ITFrank

这个也行,我用过

import java.net.UnknownHostException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

@Resource
private WebServiceContext wsContext; 
/**
* 获取请求来的ips
* @param request
* @return
*/
public String getIpAddr() {
String ipAddress = null;
MessageContext mc = wsContext.getMessageContext();
HttpServletRequest request = (HttpServletRequest) (mc
          .get(mc.SERVLET_REQUEST));
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,可有可无
     if (ipAddress.equals("127.0.0.1")
               || ipAddress.endsWith("0:0:0:0:0:0:1")) {
          // 根据网卡取本机配置的IP
          InetAddress inet = null;
          try {
               inet = InetAddress.getLocalHost();
          } catch (UnknownHostException e) {
               e.printStackTrace();
          }
          ipAddress = inet.getHostAddress();
     }

}

// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                                                                 // = 15
     if (ipAddress.indexOf(",") > 0) {
          ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
     }
}
//或者这样也行,对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 
//return ipAddress!=null&&!"".equals(ipAddress)?ipAddress.split(",")[0]:null;      
return ipAddress;
}

0
就是个精虫上脑的地方
就是个精虫上脑的地方

楼上的InetAddress.getLocalHost()方法在linux是不行的 

0
紫轩阡陌
紫轩阡陌

引用来自“ITFrank”的答案

这个也行,我用过

import java.net.UnknownHostException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

@Resource
private WebServiceContext wsContext; 
/**
* 获取请求来的ips
* @param request
* @return
*/
public String getIpAddr() {
String ipAddress = null;
MessageContext mc = wsContext.getMessageContext();
HttpServletRequest request = (HttpServletRequest) (mc
          .get(mc.SERVLET_REQUEST));
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,可有可无
     if (ipAddress.equals("127.0.0.1")
               || ipAddress.endsWith("0:0:0:0:0:0:1")) {
          // 根据网卡取本机配置的IP
          InetAddress inet = null;
          try {
               inet = InetAddress.getLocalHost();
          } catch (UnknownHostException e) {
               e.printStackTrace();
          }
          ipAddress = inet.getHostAddress();
     }

}

// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                                                                 // = 15
     if (ipAddress.indexOf(",") > 0) {
          ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
     }
}
//或者这样也行,对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 
//return ipAddress!=null&&!"".equals(ipAddress)?ipAddress.split(",")[0]:null;      
return ipAddress;
}

这个方法不行的   需要的是当时外网IP,我这么做过  但获取的IP很混乱
0
紫轩阡陌
紫轩阡陌

引用来自“tsl0922”的答案

可参考OSCHINA的实现: http://www.oschina.net/code/snippet_12_2038
这个回去试试
0
紫轩阡陌
紫轩阡陌
现在我的做法是在页面获取第三方提供的IP提交到后台存到数据库中
返回顶部
顶部