解决通过阿里云SLB多层代理后,spring boot工程获取不到客户端真实IP的问题

现在很多服务都部署到阿里云上,免不了使用SLB做负载均衡,然后又通过了nginx等代理。如果这个时候你想获取客户端访问的真实ip,你会发现一直拿到的是127.0.0.1  下面一起来解决这个问题。

现在来解决一下:

首先:配置一下SLB监听。确定获取真实IP已经开启,一般默认都是开启的,如图:

二、配置nginx转发ip信息,基本都有这段配置:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

三、重点,配置spring boot工程tomcat的ip过滤配置,主要增加最后一行, `"100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}"`, 这是 阿里云SLB对内地址段,否则默认的是没有的,这样则会被认为是对内地址,SLB 对内地址不在`"100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}"`中,则就获取不到了。

有两种配置方式,任选一种即可解决问题:

第一种最简单,直接在 spring boot 工程的application.properties工程中添加:

#配置获取客户端真实IP。这里因为通过阿里云SLB代理,所以要额外配置一下
server.tomcat.protocolHeader=X-Forwarded-Proto
server.tomcat.internalProxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|192\\.168\\.\\d{1,3}\\.\\d{1,3}|169\\.254\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}

第二种:添加一个配置类:

/*
 * 文件名:RemoteIpConfig.java 版权:Copyright by gogym 描述: 修改人:gogym 修改时间:2018年12月18日 跟踪单号: 修改单号:
 * 修改内容:
 */

package com.open.configuration;


import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


// @Configuration
public class RemoteIpConfig
{

    // 配置获取客户端真实IP。这里因为通过阿里云SLB代理,所以要额外配置一下,不在这里配置,通过配置文件指定也是可以的
    String internalProxyPattern = "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|192\\.168\\.\\d{1,3}\\.\\d{1,3}|169\\.254\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}";

    @Bean
    public RemoteIpFilter remoteIpFilter()
    {
        RemoteIpFilter ipFilter = new RemoteIpFilter();
        ipFilter.setProtocolHeader("X-Forwarded-Proto");
        ipFilter.setInternalProxies(internalProxyPattern);
        return ipFilter;
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值