2014-08-27 20 views
0

工作我想給一個變量存儲在一個控制器的行動Grails的會議:會話不是Grails的

def requestLogin = { 
     def twitterClient = new TwitterFactory().getInstance() 
     def returnUrl = g.createLink(controller: 'twitterLogin', action: 'processLogin', absolute:true).toString() 
     log.debug "Generating request with return url of [${returnUrl}]" 
     println "Generating request with return url of [${returnUrl}]" 
     def requestToken = twitterService.generateRequestToken(twitterClient, returnUrl) 
     session["twitter"] = twitterClient 
     session["requestToken"] = requestToken 
     redirect(url:requestToken.getAuthorizationURL()) 
    } 

現在,因爲它可以清楚地看到,session["requestToken"]被存儲requestToken。這顯然不是空的,因爲重定向網址工作正常。

但當它返回到回調(從Twitter的OAuth頁)作用在同一個控制器:

def processLogin = { 

     log.debug "Processing Login Return from Twitter" 
     if ((!session.requestToken) || (!params.oauth_verifier)) { 
      redirect(action: 'twitterFailedAuthentication') 
     } else { 
      //accessToken has properties token and tokenSecret which can be persisted 
      def accessToken = session.twitter.getOAuthAccessToken(session.requestToken, params.oauth_verifier) 
      session.twitterToken=accessToken.token 
      session.twitterTokenSecret=accessToken.tokenSecret 
      def twitterClient=twitterService.getTwitterClient(accessToken) 
      log.debug "Attempting validate..." 
      def twitterUser = twitterClient.showUser(twitterClient.getScreenName()) 
      log.debug "Validate successful for ${twitterUser.screenName}" 
      session.user = twitterUser 
      redirect(action: displayDetails) 
     } 
    } 

session.requestToken給空!

爲什麼會發生這種情況,如果是這樣,在會話中正確存儲值的解決方案是什麼?

編輯: 我沒有使用像spring security或shiro這樣的任何身份驗證插件。這裏是我的buildConfig.groovy依賴:

dependencies { 
     // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g. 
     //build 'org.twitter4j:twitter4j:4.0.2' 
     //build 'org.facebook4j:facebook4j-core:2.1.0' 
     // runtime 'mysql:mysql-connector-java:5.1.22' 
     runtime 'postgresql:postgresql:9.1-901-1.jdbc4' 

    } 

plugins { 
    runtime ":hibernate:$grailsVersion" 
    runtime ":jquery:1.8.3" 
    runtime ":resources:1.1.6" 

    // Uncomment these (or add new ones) to enable additional resources capabilities 
    //runtime ":zipped-resources:1.0" 
    //runtime ":cached-resources:1.0" 
    //runtime ":yui-minify-resources:0.1.5" 

    build ":tomcat:$grailsVersion" 

    runtime ":database-migration:1.3.2" 
    runtime ":rest:0.7" 

    runtime ':twitter-bootstrap:2.3.0' 
    compile ':cache:1.0.1' 
    compile ":mail:1.0.7" 
    compile ":heroku:1.0.1" 
    compile ":cloud-support:1.0.11" 
    compile ":lesscss-resources:1.3.3" 

} 

回答

0

它很可能是發生,因爲登錄的動作無效,並在登錄過程中重新創建會話。例如,Spring-security可以配置爲。

更新:

好吧,我明白了。

關鍵的一句是這樣的一個:

但當它返回到回調(從Twitter的OAuth頁)作用在同一個控制器:

如果它這樣做,會爲Twitter的請求創建一個新會話,因此原始會話的屬性不再可見。

要解決該問題,您必須使用共享持久層,以便任何會話或無會話上下文都可以訪問它。

+0

我沒有登錄行動。我沒有使用彈簧安全。事實上,我根本沒有身份驗證插件。 – rahulserver 2014-08-27 09:41:08

+0

這就是你必須要做的第一個地方:描述你的環境! – injecteer 2014-08-27 09:41:58

+0

見編輯。讓我知道是否需要更多東西來「描述你的環境!」 – rahulserver 2014-08-27 09:50:23