【问题标题】:HttpSession problem in Google App Engine/JGoogle App Engine/J 中的 HttpSession 问题
【发布时间】:2010-11-30 13:34:41
【问题描述】:

我正在使用 GAE/J 上的 Twitter4J 编写一个 Twitter 网络应用程序。

我正在会话中保存 Twitter 和 Request Token 对象,以便在回调后使用。

我有两个 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(); 

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)

【问题讨论】:

    标签: java google-app-engine twitter


    【解决方案1】:

    如果在 appengine 中将 session 设置为 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 中从会话中检索令牌和 tokenSecret:

    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/

    【讨论】:

      【解决方案2】:

      重新检查你得到了

      <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

      【讨论】:

      • 是的,我忘了说,但我已经在appengin xml文件中启用了它。
      【解决方案3】:

      HttpSession javadoc:

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

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

      我认为使用不同的 Servlet 会出现问题

      【讨论】:

        猜你喜欢
        • 2013-05-06
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 2014-01-12
        • 2013-10-25
        • 2023-03-03
        相关资源
        最近更新 更多