Проблема HttpSession в Google App Engine / J - PullRequest
0 голосов
/ 23 сентября 2009

Я пишу веб-приложение для Twitter, используя Twitter4J на GAE / J.

Я сохраняю объекты Twitter и Request Token в сеансе, чтобы их можно было использовать после обратного вызова.

У меня есть два сервлета. IndexServlet устанавливает сеанс, а HomeServlet получает из сеанса (срабатывает при обратном вызове через твиттер oAuth).

Если я закомментирую строки обработки сеанса в обоих сервлетах, то обратные вызовы будут работать нормально.

Пожалуйста, предложите любой обходной путь. Я делюсь своим кодом здесь.

IndexServlet.java

 Twitter twitter = new Twitter();
               twitter.setOAuthConsumer("<masked>", "<masked>");
               RequestToken requestToken = null;
            try {
                    requestToken = twitter.getOAuthRequestToken();
                    log.info("OAuth token has been taken");
            } catch (TwitterException e) {
                    log.warning(e.toString());
            }

            HttpSession session = request.getSession();
            if (session.getAttribute("twitter")==null){
                    session.setAttribute("twitter", twitter);
                    out.println("-----------------------------> session is set");
            }

            if (session.getAttribute("token")==null){
                    session.setAttribute("token", requestToken);
                    out.println("-----------------------------> session is set");
            }
            String authUrl = requestToken.getAuthorizationURL(); 

HomeServlet.java

                       HttpSession session = request.getSession();

                    twitter = (Twitter)session.getAttribute("twitter");
                    r  = (RequestToken)session.getAttribute("token");

                    twitter.setOAuthAccessToken(r.getAccessToken());

                    twitter.updateStatus("Hello World!"); 

Исключение

    javax.servlet.ServletException: java.lang.ArrayStoreException: [Ljava.lang.String;
 at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:239)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
 at org.mortbay.jetty.Server.handle(Server.java:313)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
 at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
 at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139)
 at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
 at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4950)
 at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4948)
 at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
 at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359)
 at com.google.net.rpc.impl.Server$2.run(Server.java:823)
 at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)

Ответы [ 3 ]

1 голос
/ 23 сентября 2009

Если установка сеансов в true в appengine не работает, тогда получите токен и tokenSecret из requestToken

Twitter twitter = new Twitter();
twitter.setOAuthConsumer(consumerKey,consumerSecret);
RequestToken requestToken = twitter.getOAuthRequestToken();

String token = requestToken.getToken();
String tokenSecret = requestToken.getTokenSecret();

HttpSession session = request.getSession();
session.setAttribute("token",token);
session.setAttribute("tokenSecret",tokenSecret);

В вашем HomeServlet получите токен и токенSecret из сеанса:

Twitter twitter = new Twitter();
twitter.setOAuthConsumer(consumerKey,consumerSecret);
AccessToken accessToken =
   twitter.getOAuthAccessToken(token, tokenSecret);
twitter.setOAuthAccessToken(accessToken);

Я также пытался хранить объекты twitter и requestToken, но у меня это не получилось. Но этот код, который я только что показал вам, сделал. У меня есть учебник, размещенный здесь между прочим: http://jeungun.wordpress.com/2009/09/03/quick-and-dirty-twitter4j-oauth-for-web-apps/

0 голосов
/ 27 июня 2010

Javadoc HttpSession:

"Информация о сеансе распространяется только на текущее веб-приложение (ServletContext), поэтому информация, хранящаяся в одном контексте, не будет видна непосредственно в другом."

http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html

Я думаю, что проблема в использовании разных сервлетов

0 голосов
/ 23 сентября 2009

перепроверьте, что вы получили

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
...
    <sessions-enabled>true</sessions-enabled>
...
</appengine-web-app>

в вашей войне / WEB-INF / lib / appengine-web.xml

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