2012-03-26 86 views
3

在我的Grails应用程序,登录失败attemps开始使用弹簧安全记录的事件,如下所示http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/single.html#7.3%20Registering%20Callback%20Closures记录特定的请求头使用弹簧安全事件

我的问题是与客户端IP检索做。通常情况下,调用getRemoteAddress从事件的详细信息对象应该做的工作,但我的情况是,我的应用程序是在一个反向代理后面,因此我应该从请求标头X-Forwarded-For

既不是事件对象也不是closes的应用程序上下文参数提供对请求对象的访问。全局请求对象也不可用。

任何想法如何访问标题或任何其他方式来实现此功能?

回答

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

+0

GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()的作品!非常感谢 – dimcookies 2012-03-26 19:54:13