Web Http以及Netty获取IP

web http获取客户端IP:

public static String getIP(HttpServletRequest request){
String 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 || "unknow".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();

if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){
//根据网卡获取本机配置的IP地址
InetAddress inetAddress = null;
try {
inetAddress = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ipAddress = inetAddress.getHostAddress();
}
}
//对于通过多个代理的情况,第一个IP为客户端真实的IP地址,多个IP按照','分割
if(null != ipAddress && ipAddress.length() > 15){
//"***.***.***.***".length() = 15
if(ipAddress.indexOf(",") > 0){
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
}

return ipAddress;
}

Netty 获取客户端IP:
public class HttpHandler extends SimpleChannelInboundHandler<Object> {

private static final Logger logger = Logger.getLogger(QiNiuHttpHandler.class);
private FullHttpRequest request;

private StartHolder holder;

public QiNiuHttpHandler(StartHolder holder) {
this.holder = holder;
}


protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof FullHttpRequest) {
request = (FullHttpRequest) msg;
}
     String uri = request.getUri();
   String clientIp = request.headers().get("X-Forwarded-For");
   if (clientIp == null) {
  InetSocketAddress insocket = (InetSocketAddress) ctx.channel().remoteAddress();
  clientIp = insocket.getAddress().getHostAddress();
   }

   QNRequest req = new QNRequest();

   req.setIp(clientIp);
   req.setUrl(uri);
   
    ContextHolder.setRequest(req);
   //逻辑处理,写入返回

//最后再清除信息
    
ContextHolder.removeRequest();
   }

}

public class ContextHolder {

private static ThreadLocal<QNRequest> request = new ThreadLocal<QNRequest>();

public static QNRequest getRequest() {
return request.get();
}

public static void setRequest(QNRequest _request) {
request.set(_request);
}

public static void removeRequest() {
request.remove();
}
}

public class QNRequest implements Serializable {

private static final long serialVersionUID = -10L;

private String reqId;
private String url;
private String ip;

public String getReqId() {
return reqId;
}

public void setReqId(String reqId) {
this.reqId = reqId;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getIp() {
return ip;
}

public void setIp(String ip) {
this.ip = ip;
}

}

posted on 2017-11-14 15:15  zgz2016  阅读(1315)  评论(0)    收藏  举报

导航