我正在GAE平台上开发一个Java Web应用程序,我正在会话中存储一个User
对象。当我在本地开发服务器(Windows XP + Eclipse)中测试我的代码时,我能够从会话中获取User
对象。
但是当我将相同的代码部署到GAE服务器时,我遇到了Session的问题。我能够检索会话对象,但无论我以前在会话中存储的数据都丢失了。
顺便说一句,我已使用appengine-web.xml
在<sessions-enabled>true</sessions-enabled>
文件中启用了会话。
有谁可以告诉我,如果有什么我在这里缺少正确使用会话?
PS:我正在使用struts2,我的动作实现了SessionAware
来获取我代码中的当前会话。
答案 0 :(得分:8)
由于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中将旧版本设置为默认值...浪费了太多时间:)