2016-03-21 6 views
0

Ich benutze Grpc-Java und bekomme die Metadaten von ServerInterceptor, aber ich bekomme unten Informationen ohne Client-IP-Adresse, die Autorität ist Server-IP, wie kann ich den Client IP bekommen ?Vielen Dank.Wie bekomme ich Client-IP von Request Metadaten mit Grpc-Java

Metadaten ({: scheme = [HTTP]: method = [post]: path = [/ test/Test1], : Autorität = [192.168.199.9:50051], grpc-encoding = [ Identität], grpc-accept-encoding = [Identität, deflate, gzip], te = [Anhänger], content-type = [Anwendung/grpc], Benutzer-Agent = [grpc-objc/0.13.0 grpc- c/0.13.0 (ios)]})

Antwort

1

Die Client-IP-Adresse ist nicht in den Metadaten enthalten. In der aktuellen Grpc-Java-Version (0.13) gibt es keine Möglichkeit, die Client-IP zu erhalten. Sobald 0.14.0 veröffentlicht ist, können Sie ServerCall.attributes() anrufen und erhalten die REMOTE_ADDR_KEY.

Bitte beachten Sie, dass die API instabil ist und sich möglicherweise ändert.

+0

Wie kann ich REMOTE_ADDR_KEY in Stream-Listener bekommen? Muss ich ThreadLocal jedes Mal verwenden, um diese Informationen abzurufen? –

+1

Das Muster, das wir vorschlagen, ist, einen einzigen zentralen "Auth-Policy" -Abfänger zu haben, der auf REMOTE_ADDR_KEY zugreifen und dann ein Objekt auf den Kontext setzen würde (was [Contexts.interceptCall()] (http://www.grpc.io/ grpc-java/javadoc/io/grpc/Contexts.html # interceptCall-io.grpc.Context-io.grpc.MethodDescriptor-io.grpc.ServerCall-io.grpc.Metadata-io.grpc.ServerCallHandler-) macht relativ einfach) –

1

In neuesten (1.2.0) gRPC verwenden Sie io.grpc.Grpc.TRANSPORT_ATTR_REMOTE_ADDR Attribut im Interceptor, um Remote-Adresse zu erhalten.

0

Client-IP ausgesetzt ist als gRPC Attribute (TRANSPORT_ATTR_REMOTE_ADDR), das ein Beispiel für den Zugriff auf sie ist here

String inetSocketString = serverCallCapture.get().getAttributes() 
    .get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR).toString();