Java App Engine - 会话在GAE服务器中不起作用

时间:2010-10-13 17:25:33

标签: java google-app-engine session struts2

我正在GAE平台上开发一个Java Web应用程序,我正在会话中存储一个User对象。当我在本地开发服务器(Windows XP + Eclipse)中测试我的代码时,我能够从会话中获取User对象。

但是当我将相同的代码部署到GAE服务器时,我遇到了Session的问题。我能够检索会话对象,但无论我以前在会话中存储的数据都丢失了。

顺便说一句,我已使用appengine-web.xml<sessions-enabled>true</sessions-enabled>文件中启用了会话。

有谁可以告诉我,如果有什么我在这里缺少正确使用会话?

PS:我正在使用struts2,我的动作实现了SessionAware来获取我代码中的当前会话。

4 个答案:

答案 0 :(得分:8)

来自the GAE documentation

  

由于App Engine将会话数据存储在数据存储区和内存缓存中,因此存储在会话中的所有值都必须实现java.io.Serializable接口。

您在会话中存储的所有值都会实现Serializable吗?您放入Session中的值所引用的任何对象也必须是可序列化的 - 整个对象图必须是。

答案 1 :(得分:1)

我正在使用Struts1并且我有完全相同的问题,所有类都实现了Serializable,它们都有注释......是否有关于此主题的一些教程?如何正确地将对象放入Session以及如何从中取回它?

答案 2 :(得分:1)

@Lada Riha你不需要改变任何东西,假设你有一个User类

class User implements Serializable{

}

在您的控制器中(假设您已经创建了User实例),您可以将对象保存在这样的会话中。

request.getSession().setAttribute("loginUser",user);

所以通过你的应用程序(来自JSP)

session.getAttribute("loginUser");

或从其他地方(其他控制人员)

request.getSession().getAttribute("loginUser");

Struts 1适用于GAE,但有一些例外。

答案 3 :(得分:0)

zawhtut:谢谢你的回答。但是,我想我已经拥有了这一切。简而言之,用户提交登录表单,一些Action类(扩展org.apache.struts.action.Action)处理它。如果值正常,则会将User的实例保存到会话:

request.getSession().setAttribute("us", u);

然后用户被重定向到jsp页面,其中是这样的:

<jsp:useBean class="cz.sayit.beans.UserBean" scope="session" id="us" />
<c:when test="${us.email != null}">
<html:form action="logout.do" >
<html:submit value="Sign out ${us.name}"/>
</html:form>
</c:when>
<c:otherwise>

到目前为止它工作正常,它显示了用户名的按钮。但是我在此页面上有另一个表单用于发布消息。当用户提交消息时,另一个动作类处理此请求,并再次尝试使用以下命令找到有关用户的信息:

UserBean u = (UserBean) request.getSession().getAttribute("us");

但是“u”在这里为空。而且我不知道为什么,在localhost它工作正常,但在GAE它不是:(

对不起这个问题,我最近使用新版本将应用程序部署到了GAE,但是在应用程序设置的appengine中将旧版本设置为默认值...浪费了太多时间:)