在我的grails应用程序中,使用Spring安全事件记录失败的登录尝试,如此处所示http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/single.html#7.3%20Registering%20Callback%20Closures
我的问题与客户端IP检索有关。通常情况下,从事件的详细信息对象调用 getRemoteAddress 应该可以完成这项工作,但我的情况是我的应用程序在反向代理后面,因此我应该从请求标头获取ip X-Forwarded-对于
closuse的事件对象和应用程序上下文参数都不提供对请求对象的访问。全局请求对象也不可用。
有关如何访问标题或任何其他方式来实现此功能的任何想法?
答案 0 :(得分:2)
您可以从RequestContextHolder
获取,如果它存在:
GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
request.getHeader("X-Forwarded-For")
通常,正如您可能知道的那样,从服务中访问Web会话并不是一个好主意。首先,您打破了服务逻辑的抽象和分离,并且请求可能并不总是可用或与当前线程相关联。从服务访问会话的一种方法是以下列方式封装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()
方法。
免责声明:代码来自Marc-Oliver Scheele的blog。