java 服务器获取请求的IP方法

在Java服务器开发中,通常需要获取客户端的IP地址用于安全验证或日志记录。通常通过`request.getRemoteAddr()`获取,但在使用代理软件后,会获取到代理服务器的IP而非真实IP。为解决这个问题,可以检查HTTP头信息中的`X-FORWARDED-FOR`字段,它包含了原始客户端IP和转发请求的服务器信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中通常少不了获取客户端请求的ip作为一些安全校验或者日志存储。
其基本逻辑为先取得配置的IP列表,然后通过request.getRemoteAddr()取得客户端的IP地址。
一般情况下,这个是没问题的,但是当使用一些代理软件之后,就获取不到真实的客户端Ip地址。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。

 /**
     * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址。
     * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
     * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串
     *
     * @param request
     * @return
     */
    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        // 如果多级如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip值,真正的用户端IP应该是第一个非unknown的有效ip字符串
        String[] ipList = ip.split(",");
        if (i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值