2014-08-27 3 views
0

Я пытаюсь сохранить переменную в 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. Это явно не является нулевым, поскольку URL-адрес перенаправления работает нормально.

Но когда он возвращается в обратный вызов (от 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 дает нулевой !!

Почему это происходит, и если да, то каково решение для хранения значений в сеансе должным образом?

EDIT: Я не использую плагин аутентификации, например, весеннюю безопасность или сиро. Вот мои 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 может сделать это, если настроено.

UPDATE:

нормально, я получил его.

ключевая фраза была такой:

Но когда он возвращается в обратный вызов (от Twitter OAuth страницы) действия в том же контроллере:

если это так, для запроса из Твиттера создается новый сеанс, поэтому атрибуты исходного сеанса больше не видны.

Чтобы решить эту проблему, вы должны использовать общий уровень персистентности, чтобы любой сеанс или контекст без сеанса могли получить к нему доступ.

+0

У меня нет действия для входа. Я не пользуюсь весной. Infact, у меня нет плагина аутентификации. – rahulserver

+0

Это то, что вам нужно было бы сделать в 1-м месте: описать свою природу! – injecteer

+0

см. Редактирование. Дайте мне знать, если вам потребуется больше, чтобы «описать вашу окружающую среду!» – rahulserver

Смежные вопросы