我正在开发一个社交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。有什么原因,可以采取什么措施解决呢?
谢谢
First-请用两种控制器方法检查您的sessionid
,它们必须相同。如果没有,那么显然您有一个新会话,这意味着该会话上没有“ twitter”属性。
Second-您的请求之间(在第一个获取令牌的请求和第二个获取令牌的请求之间)可能存在一段时间,这可能导致会话终止并生成一个没有“ twitter”的新会话”属性,因此请同时检查会话超时。