swift 如何在Vapor 3.0中获取客户端IP地址?

mwecs4sa  于 2023-01-12  发布在  Swift
关注(0)|答案(4)|浏览(193)

虽然过去有一些方法可以获得客户端IP地址(例如req.peerHostname),但我不知道如何在Vapor 3.0中获得它。
任何人都可以请让我知道如何获得客户端IP地址在蒸汽3.0?

tjrkku2a

tjrkku2a1#

感谢Vapor社区,我得到了答案。
您可以将req.http.remotePeer.hostname用于Vapor 3.0项目。

4sup72z8

4sup72z82#

嗨,希望这对Vapor 4有帮助,使用这个

func getIp(req: Request) throws -> EventLoopFuture<String> {
        print(req.headers.forwarded.first!.for)
        return req.eventLoop.makeSucceededFuture("\(req.headers.forwarded.first!.for ?? "Not found")")
 }

对我来说很好用,我想不是最好的解决方案,但很有效:)

mzmfm0qo

mzmfm0qo3#

对于Vapor 4,请使用此选项

req.remoteAddress?.ipAddress
nr9pn0ug

nr9pn0ug4#

Vapor 4包括一种确定远程对等体地址的方法,该方法支持使用和不使用代理(负载平衡器)的设置。
使用req.peerAddress
源代码注解
如果负载平衡器或反向代理在头中提供了信息,我们将尝试确定真实的对等地址。从头中获取值的优先级如下:
1.尝试“转发”报头(例如,for=192.0.2.60;原始文件=http;乘以=203.0.113.43)
1.尝试“X转发的对象”报头(例如,客户端IP、代理1 IP、代理2 IP)
1.回退到SwiftNIO提供的套接字远程地址(例如192.0.2.60:62934)
在1.和2.中,将使用端口80作为默认端口,3.将具有NIO提供端口号(如果有)
请求.swift源代码

public var peerAddress: SocketAddress? {
    if let clientAddress = headers.forwarded.first?.for {
        return try? SocketAddress.init(ipAddress: clientAddress, port: 80)
    }

    if let xForwardedFor = headers.first(name: .xForwardedFor) {
        return try? SocketAddress.init(ipAddress: xForwardedFor, port: 80)
    }

    return self.remoteAddress
}

相关问题