Атрибут сеанса Spring Boot в контроллере REST является нулевым - PullRequest
0 голосов
/ 24 января 2020

Я занимаюсь разработкой приложения для 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, который я получаю из сессии, всегда равен нулю. Любые причины, почему это так и что можно сделать, чтобы решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 24 января 2020

Первый - проверьте sessionid в обоих методах контроллера, они должны быть одинаковыми. Если это не так, очевидно, у вас есть новый сеанс, что означает, что на нем нет атрибута «twitter».

Секунда - Между вашими запросами может быть промежуток времени (между первым запросом на получение токена и вторым на получение его), который может привести к завершению сеанса и генерации нового у него больше нет атрибута «твиттер», поэтому, пожалуйста, проверьте также время ожидания вашего сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...