通过Nginx和网关到微服务获取真实请求的IP


1、Nginx

http {
    include       mime.types;
    default_type  application/octet-stream;

  upstream gwadds {
  server 127.0.0.1:81;
}

server {
  listen 80;
  server_name  gw.com;
  location / {
    proxy_pass http://gwadds/;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;                        
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

  }
}

 

2、网关配置过滤器

@Component
public class GatewayFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //  nginx 会从请求头中设置 客户端的真实ip放入网关
        String sourceIp = exchange.getRequest().getHeaders().getFirst("X-Real-IP");
        if (StringUtils.isEmpty(sourceIp)) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.BAD_REQUEST);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("code", "500");
            jsonObject.put("msg", "sourceIp is null");
            DataBuffer buffer = response.bufferFactory().wrap(jsonObject.toJSONString().getBytes());
            return response.writeWith(Mono.just(buffer));
        }
        // 使用网关过滤
        return chain.filter(exchange);
    }

}

3、微服务

@Api(tags = "会员登陆接口")
public interface MemberLoginService {

    @PostMapping("/login")
    BaseResponse<JSONObject> login(@RequestBody UserLoginDto userLoginDto, @RequestHeader("X-Real-IP")
            String sourceIp, @RequestHeader("channel") String channel, @RequestHeader("deviceInfor") String deviceInfor);
}

 

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM