java - 请求之间的 session 不持久

标签 java google-app-engine session

我的 session 对象只存储在谷歌应用引擎的请求范围内,我不知道如何在请求之间保留对象。这些文档在这件事上几乎毫无用处,我找不到遇到过类似问题的人。请帮忙。

当我在 servlet 中存储 session 对象并将请求转发到 JSP 时,使用:

getServletContext().getRequestDispatcher("/example.jsp").forward(request,response);

一切正常。但是当我将对象存储到 session 中并使用重定向请求时:

response.sendRedirect("/example/url");

session 对象丢失到以太。事实上,当我在新请求上转储 session 键/值对时,绝对没有任何东西, session 对象只出现在创建 session 对象的 servlet 的请求范围内。在我看来,这些对象并未写入 Memcache 或 Datastore。值得一提的是,在我的开发服务器上一切正常,但当我上传到 App Engine 时,它​​就崩溃了。这使我相信这是配置问题。

在为我设置的应用程序配置 session 方面

<sessions-enabled>true</sessions-enabled>

在 appengine-web.xml 中。还有什么我想念的吗?

single paragraph有关 session 的文档还指出,只有实现可序列化的对象才能存储在请求之间的 session 中。我在下面包含了一个无法正常工作的代码示例。

明显的解决方案是不使用重定向,这对于下面给出的示例可能没问题,但某些应用程序数据确实需要存储在请求之间的 session 中,因此我需要找到解决此问题的方法。

示例:FlashMessage 类从服务器端操作向用户提供反馈。

   if (email.send()) {
        FlashMessage flash = new FlashMessage(FlashMessage.SUCCESS, "Your message has been sent.");
        session.setAttribute(FlashMessage.SESSION_KEY, flash);
        // The flash message will not be available in the session object in the next request
        response.sendRedirect(URL.HOME);
    } else {
        FlashMessage flash = new FlashMessage(FlashMessage.ERROR, FlashMessage.INVALID_FORM_DATA);
        session.setAttribute(FlashMessage.SESSION_KEY, flash);
        // The flash message is displayed without problem
        getServletContext().getRequestDispatcher(Templates.CONTACT_FORM).forward(request,response);
    }

FlashMessage.java

import java.io.Serializable;

public class FlashMessage implements Serializable {
    private static final long serialVersionUID = 8109520737272565760L; // I have tried using different, default and no  serialVersionUID   
    public static final String SESSION_KEY = "flashMessage";            
    public static final String ERROR = "error";
    public static final String SUCCESS = "success";             
    public static final String INVALID_FORM_DATA = "Your request failed to validate.";

    private String message;
    private String type;

    public FlashMessage (String type, String message) {
        this.type = type;
        this.message = message;
    }

    public String display(){
        return "<div id='flash' class='" + type + "'>" + message + "</div>"; 
    }
}

最佳答案

我将日志级别调低以进行调试,发现 AppEngine 在其中一个过滤器的销毁方法中抛出异常。这就是对象未保存到 session 的原因。

我解决了异常,一切正常。

希望这对下线的人有帮助。

关于java - 请求之间的 session 不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3005229/

相关文章:

google-app-engine - GAE/Go 在本地开发服务器挂起

rest - 使用 REST API 存储、流式传输视频和处理请求

android - Facebook SDK 3.0 : Unable to call openForPublish after the during a session state CLOSED_LOGIN_FAILED

java - 如何防止 session 属性在服务器上持久化?

Java Socket 连接无需 ServerSocket 监听

java - 在java中以原子方式获取多个锁

java - 当同级元素具有相同名称但不同属性时,如何使用 Java 和 Xerces NodeIterator 获取同级元素

python - 如何在 (Python) Google App Engine 数据源上正确执行一对多联接?

session - Laravel session 表添加附加列

java - Gradle - 一个项目,多个包,多个jar