我正在尝试编写一个简单的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
}
}
非常感谢任何帮助!
答案 0 :(得分:0)
您可以通过内置的HttpServletRequest
对象从任何Grails控制器访问当前request
。正如您所做的那样,无需将此指定为方法的参数。如果你改变:
def getIpAddress(javax.servlet.http.HttpServletRequest request) {
...
为:
def getIpAddress() {
...
然后,您就可以使用request.getRemoteAddr()
(或简单地使用Groovy方便的访问器语法request.remoteAddr
)。