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;
}
}
浙公网安备 33010602011771号