在我的 Grails 应用程序中,使用 Spring Security 事件记录失败的登录尝试,如下所示 http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/single.html#7.3%20Registering%20Callback%20Closures
我的问题与客户端 IP 检索有关。通常,从事件的详细信息对象调用 getRemoteAddress 应该可以完成这项工作,但我的情况是我的应用程序位于反向代理后面,因此我应该从请求 header X-Forwarded- 获取 IP对于。
事件对象和闭包的应用程序上下文参数都不提供对请求对象的访问。全局请求对象也不可用。
有什么想法如何访问 header 或任何其他方式来实现此功能吗?
最佳答案
您可以从 RequestContextHolder
获取它(如果存在):
GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
request.getHeader("X-Forwarded-For")
一般来说,您可能知道,从服务内部访问 Web session 并不是一个好主意。首先,您打破了服务逻辑的抽象和分离,并且请求可能并不总是可用或与当前线程关联。从服务访问 session 的一种方法是按以下方式封装 HTTP session :
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 .
关于grails - 使用 Spring Security 事件记录特定的请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870233/