从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

相关文章
|
17天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
38 1
|
1月前
|
网络协议 Linux
HTTP协议基本原理简介(二)
HTTP协议基本原理简介(二)
23 1
|
1月前
|
前端开发
webpack如何设置devServer启动项目为https协议
webpack如何设置devServer启动项目为https协议
135 0
|
1月前
|
缓存 前端开发
HTTP协议基本原理简介(三)
HTTP协议基本原理简介(三)
14 1
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
4天前
|
缓存 安全 网络协议
Http协议是什么
【4月更文挑战第12天】HTTP是用于从WWW服务器传输超文本到浏览器的协议,基于TCP/IP,特点包括无连接、无状态、面向对象、无阻塞和可缓存。它的工作原理是客户端发送请求,服务器处理后返回响应。自1989年创建以来,HTTP已发展支持多媒体内容传输,并通过HTTPS提供安全保护。学习更多可参考计算机网络技术文献。
15 6
|
6天前
|
存储 JSON 前端开发
网络原理(4)HTTP协议(下)
网络原理(4)HTTP协议
19 0
|
17天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
36 1
|
24天前
|
运维 监控 算法
slb监听协议http
SLB的HTTP监听器用于处理HTTP请求,配置时选择协议类型为HTTP和前端端口(如80)。SLB根据负载算法将请求转发至健康后端服务器,并支持会话保持。通过`X-Forwarded-For`和`X-Forwarded-Proto`头处理请求信息。由于不涉及SSL/TLS,数据传输不安全,推荐升级至HTTPS以加密通信。SLB提供性能监控和故障排查工具,帮助运维管理。
21 5
|
27天前
|
程序员
深入理解HTTP协议本质与应用
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。简单来说,如果你不懂HTTP协议,那就相当于是个只有“半桶水”的程序员。在这个课程中,带你一起花最少的时间,用最少的精力,掌握最多、最全面、最系统的HTTP相关知识
14 3
深入理解HTTP协议本质与应用