从http协议中获得客户端ip

简介: import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; public final class InternetProtocol { private static Logger log = Logger.

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

public final class InternetProtocol {

private static Logger log = Logger.getLogger(InternetProtocol.class);
/**
 * 构造函数.
 */
private InternetProtocol() {
}

/**
 * 获取客户端IP地址.<br>
 * 支持多级反向代理
 * 
 * @param request
 *            HttpServletRequest
 * @return 客户端真实IP地址
 */
public static String getRemoteAddr(final HttpServletRequest request) {
    try{
        String remoteAddr = request.getHeader("X-Forwarded-For");
        // 如果通过多级反向代理,X-Forwarded-For的值不止一个,而是一串用逗号分隔的IP值,此时取X-Forwarded-For中第一个非unknown的有效IP字符串
        if (isEffective(remoteAddr) && (remoteAddr.indexOf(",") > -1)) {
            String[] array = remoteAddr.split(",");
            for (String element : array) {
                if (isEffective(element)) {
                    remoteAddr = element;
                    break;
                }
            }
        }
        if (!isEffective(remoteAddr)) {
            remoteAddr = request.getHeader("X-Real-IP");
        }
        if (!isEffective(remoteAddr)) {
            remoteAddr = request.getRemoteAddr();
        }
        return remoteAddr;
    }catch(Exception e){
        log.error("get romote ip error,error message:"+e.getMessage());
        return "";
    }
}

/**
 * 获取客户端源端口
 * @param request
 * @return
 */
public static Long getRemotePort(final HttpServletRequest request){
    try{
        String port = request.getHeader("remote-port");
        if( StringUtil.isNotEmptyString(port )) {
            try{
                return Long.parseLong(port);
            }catch(NumberFormatException ex){
                log.error("convert port to long error , port:    "+port);
                return 0l;
            }
        }else{
            return 0l;
        }        
    }catch(Exception e){
        log.error("get romote port error,error message:"+e.getMessage());
        return 0l;
    }
}

/**
 * 远程地址是否有效.
 * 
 * @param remoteAddr
 *            远程地址
 * @return true代表远程地址有效,false代表远程地址无效
 */
private static boolean isEffective(final String remoteAddr) {
    boolean isEffective = false;
    if ((null != remoteAddr) && (!"".equals(remoteAddr.trim()))
            && (!"unknown".equalsIgnoreCase(remoteAddr.trim()))) {
        isEffective = true;
    }
    return isEffective;
}

}

本地测试localhost会出现0:0:0:0:0:0:0:1

相关文章
|
2月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
61 4
|
9天前
HAProxy的高级配置选项-配置haproxy支持https协议及服务器动态上下线
文章介绍了如何配置HAProxy以支持HTTPS协议和实现服务器的动态上下线。
38 8
HAProxy的高级配置选项-配置haproxy支持https协议及服务器动态上下线
|
14天前
|
安全 Java Shell
【内网—内网转发】——http协议代理转发_reGeorg代理转发
【内网—内网转发】——http协议代理转发_reGeorg代理转发
15 3
|
19天前
|
机器学习/深度学习 Ubuntu Linux
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
|
24天前
|
存储 网络协议 安全
HTTP协议和运行原理
HTTP协议和运行原理
|
5天前
|
网络协议
网络协议概览:HTTP、UDP、TCP与IP
理解这些基本的网络协议对于任何网络专业人员都是至关重要的,它们不仅是网络通信的基础,也是构建更复杂网络服务和应用的基石。网络技术的不断发展可能会带来新的协议和标准,但这些基本协议的核心概念和原理将继续是理解和创新网络技术的关键。
13 0
|
1月前
|
域名解析 缓存 网络协议
揭秘DNS协议:从'http://www.example.com'到IP地址的奇幻旅程,你不可不知的互联网幕后英雄!
【8月更文挑战第4天】在互联网的广袤空间里,每台设备都有唯一的IP地址,但记忆这些数字组合并不直观。因此,DNS(域名系统)作为关键桥梁出现,将易记的域名转换为IP地址。DNS协议工作于应用层,支持用户通过域名访问资源。DNS系统包含多级服务器,从根服务器到权威服务器,共同完成域名解析。查询过程始于客户端,经过递归或迭代查询,最终由权威服务器返回IP地址,使浏览器能加载目标网页。
73 12
|
1月前
|
安全 算法 网络协议
【在Linux世界中追寻伟大的One Piece】HTTPS协议原理
【在Linux世界中追寻伟大的One Piece】HTTPS协议原理
37 2
|
1月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
61 1