2012-03-26 89 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