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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KokJuis/article/details/85070901

现在很多服务都部署到阿里云上,免不了使用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;
    }
}

展开阅读全文

没有更多推荐了,返回首页