[英]HttpSession problem in Google App Engine/J
I am writting a Twitter web app by using Twitter4J on GAE/J. 我正在通过GAE / J上的Twitter4J编写一个Twitter Web应用程序。
I am saving Twitter and Request Token objects in session so that to be used after call back. 我将Twitter和Request Token对象保存在会话中,以便在回叫后使用。
I have two servlets. 我有两个servlet。 IndexServlet sets session and HomeServlet get from session (hits on call back by twitter oAuth).
IndexServlet设置会话,而HomeServlet从会话获取(通过Twitter oAuth进行回叫)。
If I comment out session handling lines in both servlets then call backs works fine. 如果我注释掉两个Servlet中的会话处理行,则回调工作正常。
Please suggest any workaround. 请提出任何解决方法。 I am sharing my code here.
我在这里分享我的代码。
IndexServlet.java 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 HomeServlet.java
HttpSession session = request.getSession();
twitter = (Twitter)session.getAttribute("twitter");
r = (RequestToken)session.getAttribute("token");
twitter.setOAuthAccessToken(r.getAccessToken());
twitter.updateStatus("Hello World!");
Exception 例外
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)
If setting sessions to true in appengine doesn't work then get the token and tokenSecret from the requestToken 如果在Appengine中将会话设置为true不起作用,则从requestToken获取令牌和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);
In your HomeServlet retrieve the token and tokenSecret from the session: 在您的HomeServlet中,从会话中检索令牌和tokenSecret:
Twitter twitter = new Twitter();
twitter.setOAuthConsumer(consumerKey,consumerSecret);
AccessToken accessToken =
twitter.getOAuthAccessToken(token, tokenSecret);
twitter.setOAuthAccessToken(accessToken);
I also tried storing twitter and requestToken objects before but it didn't work out for me. 我也尝试过存储twitter和requestToken对象,但是对我来说不起作用。 But this code I just showed you did.
但是我刚刚向您展示的这段代码确实做到了。 I have a tutorial posted here btw: http://jeungun.wordpress.com/2009/09/03/quick-and-dirty-twitter4j-oauth-for-web-apps/
我在这里发布了一个教程,顺便说一句: http : //jeungun.wordpress.com/2009/09/03/quick-and-dirty-twitter4j-oauth-for-web-apps/
recheck that you got 重新检查你得到了
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
...
<sessions-enabled>true</sessions-enabled>
...
</appengine-web-app>
in your war/WEB-INF/lib/appengine-web.xml 在您的war / WEB-INF / lib / appengine-web.xml中
HttpSession javadoc: HttpSession javadoc:
"Session information is scoped only to the current web application (ServletContext), so information stored in one context will not be directly visible in another." “会话信息仅适用于当前的Web应用程序(ServletContext),因此存储在一个上下文中的信息将不会在另一个上下文中直接可见。”
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html
I think that problem in using different Servlets 我认为在使用不同的Servlet时出现问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.