【问题标题】:Session not working in grails会话在 grails 中不起作用
【发布时间】:2014-08-27 09:31:09
【问题描述】:

我正在尝试在一个控制器的 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 给出 null!!

为什么会发生这种情况,如果是这样,正确存储会话中的值的解决方案是什么?

编辑: 我没有使用任何身份验证插件,例如 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"

}

【问题讨论】:

    标签: java session grails


    【解决方案1】:

    这很可能正在发生,因为登录操作会在登录期间使您的会话无效并重新创建。例如,如果配置为 Spring-security 就可以做到。

    更新:

    好的,我明白了。

    关键短语是这个:

    但是当它返回到同一控制器中的回调(来自 twitter oAuth 页面)操作时:

    如果这样做,则会为来自 Twitter 的请求创建一个新会话,因此您的原始会话的属性将不再可见。

    要解决这个问题,你必须使用共享持久层,这样任何会话或无会话上下文都可以访问它。

    【讨论】:

    • 我没有登录操作。我没有使用弹簧安全。事实上,我根本没有身份验证插件。
    • 这是您首先要做的:描述您的环境!
    • 查看编辑。让我知道是否还需要“描述您的环境”!
    • 您能否详细说明什么是“共享持久层”?有没有可用的插件?有链接吗?有参考吗?
    • 您可以使用 GORM 建立一个简单的 DB,或者在服务中定义一个单例 ConcurrentHashMap 以将 authTokens 保存在 RAM 中。第二种方法更可取,因为您需要将令牌保留最多 1 分钟。您还可以使用谷歌的番石榴缓存code.google.com/p/guava-libraries,它提供自动清理
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多