В моем приложении Grails неудачные попытки входа регистрируются с использованием событий безопасности spring, как показано здесь http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/single.html#7.3%20Регистрация%20Обратныйвызов%20Замыкания
Моя проблема связана с получением IP-адреса клиента. Обычно вызов getRemoteAddress из объекта сведений о событии должен выполнять задание, но в моем случае мое приложение находится за обратным прокси-сервером, поэтому я должен получить IP-адрес из заголовка запроса X-Forwarded- Для.
Ни объект события, ни параметры контекста приложения закрытия не предоставляют доступ к объекту запроса. Глобальный объект запроса также недоступен.
Любые идеи, как получить доступ к заголовкам или любым другим способом реализовать эту функциональность?
Ответ 1 · рейтинг 2 · Michael Foukarakis
Вы можете получить его от RequestContextHolder, если он существует:
GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
request.getHeader("X-Forwarded-For")
Как правило, как вы, вероятно, знаете, доступ к веб-сеансу из Служб не считается хорошей идеей. Во-первых, вы нарушаете абстракцию и разделение сервисной логики, и запросы не всегда могут быть доступны или связаны с текущим потоком. Один из способов получить доступ к сеансу из службы - инкапсулировать сеанс HTTP следующим образом:
class WebUtilService {
void withSession (Closure closure) {
try {
GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
GrailsHttpSession session = request.session
closure.call(session)
}
catch (IllegalStateException ise) {
log.warn ("No WebRequest available!")
}
}
}
и вы бы использовали его так:
class MyService {
WebUtilService webUtilService
void doSomething() {
webUtilService.withSession { HttpSession session ->
log.info(session.myValue)
session.newValue = 'Possible, but should be exceptional'
}
}
}
где вы могли бы иметь доступ к методу getHeader().
Отказ от ответственности: код взят из блога а>.