无法在Grails中获取客户端IP

时间:2014-10-06 15:52:52

标签: grails ip

我正在尝试编写一个简单的Grails控制器,它将返回用户的位置。

当我在IP地址中硬核时,位置部分工作正常。问题在于获取用户的IP地址。

运行以下代码后,出现以下错误:

“没有方法签名:helloworld.HelloController.getRemoteAddr()适用于参数类型:()值:[]”

错误似乎是由以下行引起的:

def ipAddress = getRemoteAddr()

我在运行grails app的机器上通过localhost:8090 / helloworld / hello / index连接,在我的笔记本电脑上连接192.168.0.10:8090/helloworld/hello.index。

我的其余代码:

类HelloController {

def geoIpService

def index() {

    def ip = getIpAddress()
    def location = geoIpService.getLocation(ip)
    render location.countryName + " " + location.city     
}           

def getIpAddress(javax.servlet.http.HttpServletRequest request) {
    // def ipAddress = getRemoteAddr()

    def ipAddress = getRemoteAddr()

    if (ipAddress && InetAddressValidator.VALIDATOR.isValid(ipAddress)){
        log.debug("Remote IP Address ::: " + ipAddress)

        return ipAddress
    }

    ipAddress = request.getHeader("X-Forwarded-For")

    if(ipAddress && InetAddressValidator.VALIDATOR.isValid(ipAddress)) {
        log.debug("Remote IP Address ::: " + ipAddress)

        return ipAddress
    }

    ipAddress = request.getHeader("Client-IP")

    if(ipAddress && InetAddressValidator.VALIDATOR.isValid(ipAddress)) {
        log.debug("Remote IP Address ::: " + ipAddress)

        return ipAddress
    }
    return ipAddress

}

}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以通过内置的HttpServletRequest对象从任何Grails控制器访问当前request。正如您所做的那样,无需将此指定为方法的参数。如果你改变:

def getIpAddress(javax.servlet.http.HttpServletRequest request) {
...

为:

def getIpAddress() {
...

然后,您就可以使用request.getRemoteAddr()(或简单地使用Groovy方便的访问器语法request.remoteAddr)。