Spring Boot会话属性在REST控制器中为null

问题描述 投票:0回答:1

我正在开发一个社交Twitter应用程序,正在使用Spring Boot 2.2.2。我正在按照https://careydevelopment.us/2017/05/24/implement-twitter-login-solution-spring-boot/的说明进行操作。

我刚刚修改了代码,使其更加面向REST,而不是RedirectView(如上面的链接所述)

    @PostMapping("/getToken")
    public ResponseEntity<TwitterTokenResponse> getToken(HttpServletRequest request) throws Exception {
        Twitter twitter = getTwitter();
        String callbackUrl = "http://localhost:3000/settings";
        RequestToken requestToken = twitter.getOAuthRequestToken(callbackUrl);
        request.getSession().setAttribute("requestToken", requestToken);

        *//setting twitter attribute in session*
        request.getSession().setAttribute("twitter", twitter);
        String twitterUrl = requestToken.getAuthorizationURL();
        TwitterTokenResponse twitterTokenResponse = new TwitterTokenResponse(requestToken.getToken(), requestToken.getTokenSecret(), true, 0L, null);
        log.info("Authorization url is " + twitterUrl);
        log.info("Request token is " + requestToken);
        return ResponseEntity.ok(twitterTokenResponse);
    }

    @PostMapping("/twitterCallback")
    public ResponseEntity<TwitterTokenResponse> twitterCallback(@RequestParam(value = "oauth_verifier", required = false) String oauthVerifier, @RequestParam(value = "denied", required = false) String denied, HttpServletRequest request) throws Exception {
        if (denied != null) {
            log.error("Could not get token from Twitter! Access denied");
            return null;
        }

        *//Getting twitter attribute back from session but it is null*
        Twitter twitter = (Twitter) request.getSession().getAttribute("twitter");
        RequestToken requestToken = (RequestToken) request.getSession().getAttribute("requestToken");
        AccessToken token = twitter.getOAuthAccessToken(requestToken, oauthVerifier);
        request.getSession().removeAttribute("requestToken");
        TwitterTokenResponse twitterTokenResponse = new TwitterTokenResponse(token.getToken(), token.getTokenSecret(), true, token.getUserId(), token.getScreenName());
        log.info("Access token is " + token);
        return ResponseEntity.ok(twitterTokenResponse);
    }

正如在getToken()方法中可以看到的那样,我正在会话中设置twitter变量,并尝试在twitterCallback()方法中从会话中获取相同的变量。我从会话中获得的twitter属性始终为null。有什么原因,可以采取什么措施解决呢?

谢谢

spring spring-boot session
1个回答
0
投票

First-请用两种控制器方法检查您的sessionid,它们必须相同。如果没有,那么显然您有一个新会话,这意味着该会话上没有“ twitter”属性。

Second-您的请求之间(在第一个获取令牌的请求和第二个获取令牌的请求之间)可能存在一段时间,这可能导致会话终止并生成一个没有“ twitter”的新会话”属性,因此请同时检查会话超时。

© www.soinside.com 2019 - 2024. All rights reserved.