代码之家  ›  专栏  ›  技术社区  ›  Tahir

谷歌应用引擎中的httpsession问题/j

  •  0
  • Tahir  · 技术社区  · 15 年前

    我正在用gae/j上的twitter4j编写一个twitter网络应用程序。

    我在会话中保存Twitter并请求令牌对象,以便在回调后使用。

    我有两个servlet。indexservlet设置会话和homeservlet从会话获取(点击twitter oauth回电)。

    如果我在两个servlet中注释掉会话处理行,那么回调工作正常。

    请提出任何解决办法。我在这里共享我的代码。

    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(); 
    

    家庭服务器.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 回复  |  直到 14 年前
        1
  •  1
  •   Jeune    15 年前

    如果在appengine中将sessions设置为true不起作用,那么从requesttoken获取token和tokensecret

    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中,从会话中检索令牌和令牌机密:

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

    我以前也尝试过存储twitter和requesttoken对象,但它不适用于我。但我刚才给你看的代码是这样的。我在这里发布了一个教程btw: http://jeungun.wordpress.com/2009/09/03/quick-and-dirty-twitter4j-oauth-for-web-apps/

        2
  •  0
  •   Boris Daich    15 年前

    重新检查你得到的

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

    在war/web-inf/lib/appengine-web.xml中

        3
  •  0
  •   abuharsky    14 年前

    httpsession JavaDoc(httpsession JavaDoc):

    会话信息仅限于当前Web应用程序(servletcontext),因此存储在一个上下文中的信息在另一个上下文中不会直接可见。

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

    我认为使用不同的servlet的问题