2010-05-05 25 views
3

如何從命令對象中獲取會話?在Grails中獲取命令對象中的會話

我曾嘗試:

import org.springframework.security.context.SecurityContextHolder as SCH 

class MyCommand { 
    def session = RCH.currentRequestAttributes().getSession() 
} 

這將引發

java.lang.IllegalStateException:沒有線程綁定請求中找到:你是指請求屬性實際web請求之外,或處理請求在原始接收線程之外?如果實際上在Web請求中運行並仍然收到此消息,則代碼可能在DispatcherServlet/DispatcherPortlet之外運行:在這種情況下,請使用RequestContextListener或RequestContextFilter來公開當前請求。

回答

4

對於Spring Security的SecurityContextHolder,您有一個導入,但您使用的是標準的Grails請求持有者。如果您使用的是Acegi的插件,再有就是那臺由org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder管理一個ThreadLocal請求的過濾器,所以這將工作:

import org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder as SRH 
class MyCommand { 
    def someMethod() { 
     def session = SRH.request.session 
    } 
} 

注意必須在方法中,因爲命令類將在啓動時初始化一次或多次,因此您只需在執行HTTP請求期間訪問會話和請求。

+0

謝謝,我是否需要在我的驗證器中調用「someMethod()」? – RyanLynch 2010-05-05 22:36:13

+0

不,您可以直接在驗證器中訪問SRH.request.session,因爲它將在http請求的上下文中調用。你無法將其定義爲一個字段。 – 2010-05-05 22:46:31

1

也可以訪問會話使用RequestContextHolder(以避免Spring安全依賴/導入):

import org.springframework.web.context.request.RequestContextHolder as RCH 
class MyCommand { 
    def someMethod() { 
     def session = RCH.requestAttributes.session 
    } 
} 
1

另一種方式:

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest 
HttpSession session = GrailsWebRequest.lookup().currentRequest.session 

在我的應用程序SecurityRequestHolder.request返回null莫名其妙,但上述工作的方式。

+0

關於grails 2.5.x |錯誤java.lang.NullPointerException:無法在空對象上獲取屬性'currentRequest' – 2017-11-03 06:16:31