从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

相关文章
|
13天前
|
缓存 监控 负载均衡
提升HTTP动态代理IP性能的最佳实践
在现代网络环境中,HTTP动态代理IP的优化配置至关重要。通过选择合适的代理类型(正向/反向代理)、配置缓存、使用负载均衡、加强安全配置(SSL/TLS加密、身份验证)、管理日志、性能监控、限制带宽、定期更新软件和优化用户体验(减少延迟、内容压缩),可以显著提升网络性能、安全性及用户满意度。根据具体需求灵活调整配置,实现最佳效果。
131 64
提升HTTP动态代理IP性能的最佳实践
|
5天前
|
缓存 网络协议 前端开发
Web 性能优化|了解 HTTP 协议后才能理解的预加载
本文旨在探讨和分享多种预加载技术及其在提升网站性能、优化用户体验方面的应用。
Web 性能优化|了解 HTTP 协议后才能理解的预加载
|
10天前
|
XML JSON 前端开发
HTTP协议,Content-Type格式介绍篇
通过理解和正确使用Content-Type头字段,可以确保数据在网络上传输时的正确性和高效性,提升网络应用的可靠性和用户体验
58 28
|
8天前
|
XML JSON 前端开发
HTTP协议,Content-Type格式介绍篇
通过理解和正确使用Content-Type头字段,可以确保数据在网络上传输时的正确性和高效性,提升网络应用的可靠性和用户体验。
122 25
|
11天前
|
XML JSON 前端开发
HTTP协议,Content-Type格式介绍篇
通过理解和正确使用Content-Type头字段,可以确保数据在网络上传输时的正确性和高效性,提升网络应用的可靠性和用户体验。
146 18
|
1月前
|
域名解析 缓存 网络协议
Web基础与HTTP协议
通过掌握这些基础知识和技术,开发者可以更加高效地构建和优化Web应用,提供更好的用户体验和系统性能。
74 15
|
27天前
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
1月前
免费HTTP代理IP对业务稳定性的影响关键因素分析
随着互联网发展,使用代理IP的需求增加。免费代理IP虽便捷,但对业务稳定性有负面影响:1. 网络连接不稳定,易中断;2. 频繁更换IP影响业务连续性;3. 性能差,速度慢、响应延迟高;4. 服务质量低,缺乏技术支持且存在不受控的限制。因此,选择代理服务时需谨慎评估其对业务的影响。
59 13
|
28天前
|
数据采集 安全 搜索推荐
HTTP代理IP纯净度 提升用户网络体验的核心竞争力
随着互联网发展,使用HTTP动态代理IP的需求日益增加。高纯净度的代理IP在隐私与安全、网络体验和业务运营方面至关重要。它能保护用户信息、提高数据安全性、确保访问速度和连接稳定,并提升业务效率与信誉度。
45 2
|
29天前
|
缓存 网络协议 算法
从零开始掌握HTTP协议
本文介绍HTTP协议的演变,从HTTP1.0到HTTP2.0。HTTP1.0为无状态连接,每次请求独立;HTTP1.1引入持久连接、管道化请求和更多状态码;HTTP2.0采用二进制分帧、多路复用、头部压缩及服务器主动推送,大幅提升性能与用户体验。了解这些区别有助于开发者优化应用和服务。

热门文章

最新文章