【问题标题】:How to add twitter capability to my struts2 application如何将 twitter 功能添加到我的 struts2 应用程序
【发布时间】:2013-11-19 12:47:06
【问题描述】:

我开发了 struts2 网络应用程序,现在我希望人们从他们的 Twitter 帐户登录,所以我需要在我的正常登录按钮下放置一个名为“使用 Twitter 登录”的按钮。我已经进行了 Facebook 集成,据我所知,我们需要首先在 twitter 中创建应用程序,所以我这样做了,然后我很困惑该怎么做,请任何人指导我完成这些步骤。

【问题讨论】:

  • 我已经完成了 facebook 和 twitter,如果你能找到 google 那就太好了。
  • 我放弃了我的心和灵魂,但我无法完成它,请帮助我。
  • 让我知道你在哪里卡住了,但下面的代码是一个不太完整的解决方案。

标签: struts2 twitter twitter-oauth


【解决方案1】:

我真的不记得在 twitter 上注册您的应用程序的过程,而是在 google 上“使用 twitter 进行单点登录 (SSO)”。

首先您需要注册您的应用程序,在此过程中您将获得一个 consumer_key 和一个 consumer_secret(不确定这些是否是 twitter 术语)。

然后流程是使用这些凭据将用户发送到 twitter,让用户登录,然后让 twitter 通过回调将控制权返回给您的应用程序。该回调将包含一个授权令牌,它将授予对 twitter 服务的访问权限,因此我们将其保存在会话中。

在您注册应用程序后,以下代码将执行登录,并让您发布字符串“hello!”到您的 twitter 帐户(假设应用程序具有此权限)。

TwitterGrantAccess.java

package com.quaternion.demo.action.twitter;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.SessionAware;
import org.scribe.builder.ServiceBuilder;
import org.scribe.builder.api.TwitterApi;
import org.scribe.model.Token;
import org.scribe.oauth.OAuthService;

@Results(value = {
    @Result(name = "success", location = "${authorizationURL}", type = "redirect"),
    @Result(name = "error", location = "/WEB-INF/content/error.jsp")
})
public class TwitterGrantAccess extends ActionSupport implements SessionAware {

    private Map<String, Object> session;
    private String authorizationURL = null;

    @Override
    public String execute() {
        //Twitter twitter = new TwitterFactory().getInstance();
        String consumer_key = "NOT_PUTTING_MY_KEY_ON_STACK_OVERFLOW!";
        String consumer_secret = "NOT_PUTTING_MY_CONSUMER_SECRET_ON_STACK_OVERFLOW!";

        OAuthService twitterService = new ServiceBuilder()
                .provider(TwitterApi.class)
                .apiKey(consumer_key)
                .apiSecret(consumer_secret)
                .callback("http://localhost:8080/demo/twitter/twitter-callback")
                .build();
        Token requestToken = twitterService.getRequestToken();
        authorizationURL = twitterService.getAuthorizationUrl(requestToken);
        session.put("twitterService", twitterService);
        session.put("requestToken", requestToken);
        return SUCCESS;
    }

    public String getAuthorizationURL() {
        return this.authorizationURL;
    }

    @Override
    public void setSession(Map<String, Object> map) {
        this.session = map;
    }
}

twitter 调用的回调(你不会作为用户调用的东西)...... TwitterCallback.java

package com.quaternion.demo.action.twitter;



import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.SessionAware;
import org.scribe.model.Token;
import org.scribe.model.Verifier;
import org.scribe.oauth.OAuthService;

@Results(value = {
    @Result(name = "success", location = "/WEB-INF/content/twitter/twitter-callback-success.jsp"),
    @Result(name = "error", location = "/WEB-INF/content/twitter/twitter-callback-error.jsp")
})
public class TwitterCallback extends ActionSupport implements SessionAware {

    private Map<String, Object> session;
    private String key;
    private String secret;
    //returned from twitter
    private String oauth_token;
    private String oauth_verifier;

    @Override
    public String execute() {
        if (session.containsKey("accessToken") && session.get("accessToken") != null) {
            return SUCCESS; //accessToken already exists!
        }
        Token requestToken = (Token) session.get("requestToken");
        if (objectToken == null) {
            super.addActionError("requestToken is null");
            return ERROR;
        }
        OAuthService twitterService = (OAuthService) session.get("twitterService");
        System.out.println(requestToken.toString());
        System.out.println(this.getOauth_verifier());
        //Token accessToken = twitter.getOAuthAccessToken(requestToken, this.getOauth_verifier());
        Token accessToken = twitterService.getAccessToken(requestToken, new Verifier(this.getOauth_verifier()));
        session.put("accessToken", accessToken);
        this.setKey(accessToken.getToken()); //just to see something happen
        this.setSecret(accessToken.getSecret());//just to see something happen
        return SUCCESS;
    }

    @Override
    public void setSession(Map<String, Object> map) {
        this.session = map;
    }

    /**
     * @return the key
     */
    public String getKey() {
        return key;
    }

    /**
     * @param key the key to set
     */
    public void setKey(String key) {
        this.key = key;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }

    public String getOauth_token() {
        return oauth_token;
    }

    /**
     * @param oauth_token the oauth_token to set
     */
    public void setOauth_token(String oauth_token) {
        this.oauth_token = oauth_token;
    }

    public String getOauth_verifier() {
        return oauth_verifier;
    }


    public void setOauth_verifier(String oauth_verifier) {
        this.oauth_verifier = oauth_verifier;
    }
}

完成此操作后,您的应用程序现在可以使用 API,让我们发布一条推文:

Tweet.java

//Posts the string "hello!" to the users twitter feed then redirects to
//ken_mcwilliams twitter url, because that is the account I will be
//logging into... change you your own account during development 

package com.quaternion.demo.action.twitter;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.SessionAware;
import org.scribe.model.OAuthRequest;
import org.scribe.model.Response;
import org.scribe.model.Token;
import org.scribe.model.Verb;
import org.scribe.oauth.OAuthService;

@Results({
    @Result(name = "success", location = "https://twitter.com/#!/ken_mcwilliams", type = "redirect")
})
public class Tweet extends ActionSupport implements SessionAware {

    private Map<String, Object> session;
    private String status;

    @Override
    public String execute() {
        Token accessToken = (Token) session.get("accessToken");
        OAuthService twitterService = (OAuthService) session.get("twitterService");
        String url = "http://api.twitter.com/1/statuses/update.json?status=";
        String twitterStatus;
        if (status == null || status.isEmpty() == true) {
            twitterStatus = "hello!";
        }else{
            twitterStatus = status;
        }

        OAuthRequest request = new OAuthRequest(Verb.POST, url + twitterStatus);
        twitterService.signRequest(accessToken, request); // the access token from step 4
        Response response = request.send();
        return SUCCESS;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getStatus() {
        return this.status;
    }

    @Override
    public void setSession(Map<String, Object> map) {
        session = map;
    }
}

PS:twitter-callback-success.jsp 和 twitter-callback-error.jsp 不包含任何有趣的内容,它们只是声明“您现在可以访问 twitter,一切都很棒!”和“发生了可怕的错误”。

【讨论】:

  • 哦,从今天开始,它已经过测试。这只是一些快速演示代码,如果您要使用它,请测试一下。
  • 非常感谢先生,但我需要使用 struts2 通过 twitter 登录到我的 Web 应用程序,可以吗?
  • 请不要介意,我是 Java 新手,所以我很难理解您发送的代码。请解释我如何在我的 struts2 项目中实现,使用 twitter 登录以登录我的项目
  • 代码只需要一个带有 struts2-conventions-plugin 的基本 struts2-project ... 导入已经发布,所以你可以找出依赖关系 我建议创建一个新的 struts2 项目,然后你只需调用“twitter-grant-access”操作,然后调用“tweet”操作。如前所述,您需要在 twitter 上注册您的应用程序以获得有效的 consumer_key 和 consumer_secret。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2010-12-13
  • 2022-01-19
  • 2020-12-11
  • 2010-10-24
  • 1970-01-01
相关资源
最近更新 更多