代码之家  ›  专栏  ›  技术社区  ›  Veera

Java应用程序引擎-会话在GAE服务器中不工作

  •  1
  • Veera  · 技术社区  · 15 年前

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

    但当我将同一段代码部署到GAE服务器时,我面临会话问题。我可以检索会话对象,但是之前存储在会话中的数据丢失了。

    顺便说一下,我已经启用了 appengine-web.xml <sessions-enabled>true</sessions-enabled> .

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

    PS:我正在使用struts2和我的actions实现 SessionAware 在我的代码中获取当前会话。

    4 回复  |  直到 15 年前
        1
  •  8
  •   matt b    15 年前

    the GAE documentation :

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

        2
  •  1
  •   ladar    15 年前

    我在使用Struts1,我遇到了完全相同的问题,所有的类都实现了可序列化,它们都有注释。。。有关于这个话题的教程吗?如何正确地将对象放到会话中,以及如何从会话中取回它?

        3
  •  1
  •   zawhtut    15 年前

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

    class User implements Serializable{
    
    }
    

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

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

    所以通过您的应用程序(从JSP)

    session.getAttribute("loginUser");
    

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

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

        4
  •  0
  •   ladar    15 年前

    谢谢你的回答。然而,我想我已经拥有了这一切。简而言之,用户提交登录表单,一些操作类(扩展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”在这里是空的。我不知道为什么,在本地主机上运行良好,但在GAE上不是:(

    抱歉,这个问题,我最近部署了新版本的应用程序到GAE,但是appengine中的app settings将旧版本设置为默认版本。。。浪费了这么多时间:)