Как получить IP-адрес клиента в контроллере Grails?

У меня был такой код в Ruby:

@clientipaddress = request.env["HTTP_CLIENT_IP"]
if (@clientipaddress == nil)
  @clientipaddress = request.env["HTTP_X_FORWARDED_FOR"]
end
if (@clientipaddress == nil)
  @clientipaddress = request.env["REMOTE_ADDR"]
end
if (@clientipaddress != nil)
  comma = @clientipaddress.index(",")
  if (comma != nil && comma >= 0)
    @clientipaddress = @clientipaddress[0, comma]
  end
end

Он позаботился обо всех возможных способах появления IP. Например, на моей локальной машине разработки нет прокси. Но в QA и Production прокси есть, и иногда они предоставляют более одного адреса.

Мне не нужно знать синтаксис Groovy, просто какие методы дают мне эквивалент трех разных способов, которыми я запрашиваю IP выше.


person Andrew    schedule 26.01.2010    source источник


Ответы (2)


Я думаю, это должно быть то, что вы хотите:

  • request.getRemoteAddr()
  • request.getHeader("X-Forwarded-For")
  • request.getHeader("Client-IP")
person Michael Borgwardt    schedule 26.01.2010
comment
Я пробовал это, но получаю: Нет такого свойства: запрос потратил 1 час на поиск этой ошибки, не повезло. Кто-нибудь знает, как это решить? - person John Little; 20.05.2014
comment
вы делаете это внутри контроллера? Это введенное свойство и должно быть там. - person Neoryder; 02.09.2014
comment
С прокси-сервера X-Forwarded-For даст вам правильное значение. - person Ratata Tata; 03.07.2017
comment
Каким должен быть правильный способ захвата IP-адреса из действительной переменной? - person IgniteCoders; 07.01.2020
comment
@IgniteCoders: я не уверен, что вы имеете в виду. Можете ли вы переформулировать вопрос? - person Michael Borgwardt; 07.01.2020
comment
Я имею в виду, что первая строка кода дает мне IP, но когда я должен использовать две другие строки или методы? - person IgniteCoders; 07.01.2020
comment
@IgniteCoders: Это зависит от того, для чего вам нужна эта информация. В первой строке указан IP-адрес машины, с которой вы получаете запрос, но это может быть и прокси-сервер. Два других способа используются разными прокси-серверами, чтобы сообщить вам, с какой машины первоначально пришел запрос (и теперь есть также стандартизированный Forwarded-header, который имеет более сложный формат). Обычно вы пытаетесь использовать разные заголовки прокси, и только если ни один из них не присутствует, вы используете удаленный адрес. - person Michael Borgwardt; 07.01.2020

//action in controller 
def postentry (accountno) {
def fulldata = request.reader.text 
def remoteadd = request.getRemoteAddr()
println "ip request  "+remoteadd
...
}

результат ---ip запрос 0:0:0:0:0:0:0:1

person Teejay    schedule 26.09.2018
comment
Было бы полезно, если бы вы объяснили свой ответ, а не просто сбросили код. - person Dragonthoughts; 26.09.2018