【问题标题】:Java App Engine - Sessions are not working in GAE serverJava App Engine - 会话在 GAE 服务器中不起作用
【发布时间】:2011-04-24 23:42:38
【问题描述】:

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

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

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

谁能告诉我这里是否缺少一些东西来正确使用会话?

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

【问题讨论】:

    标签: java google-app-engine session struts2


    【解决方案1】:

    来自the GAE documentation

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

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

    【讨论】:

      【解决方案2】:

      我正在使用 Struts1,但我遇到了完全相同的问题,所有类都实现了 Serializable,它们都有所有注释......有没有关于这个主题的教程?如何正确地将对象放入 Session 以及如何从中取回?

      【讨论】:

        【解决方案3】:

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

        class User implements Serializable{
        
        }
        

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

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

        整个应用程序(来自 JSP)

        session.getAttribute("loginUser");
        

        或来自其他地方(其他控制器)

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

        Struts 1 在 GAE 上工作,但有一些例外。

        【讨论】:

        • 当我做 request.getSession().getAttribute("loginUser");我得到一个“BytesHolder”而不是我的序列化对象
        【解决方案4】:

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

        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 的应用程序设置中将旧版本设置为默认...浪费了这么多小时:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-22
          • 2019-07-22
          • 1970-01-01
          • 2013-09-08
          • 2014-09-28
          相关资源
          最近更新 更多