Java 请求之间未持久化的会话

Java 请求之间未持久化的会话,java,google-app-engine,session,Java,Google App Engine,Session,我的会话对象只存储在google app engine的请求范围内,我不知道如何在请求之间持久化对象。这些文件在这件事上几乎毫无用处,我找不到有类似问题的人。请帮忙 当我将会话对象存储在servlet中并使用以下命令将请求转发到JSP时: getServletContext().getRequestDispatcher("/example.jsp").forward(request,response); 一切正常。但当我将对象存储到会话并使用以下命令重定向请求时: response.sendR

我的会话对象只存储在google app engine的请求范围内,我不知道如何在请求之间持久化对象。这些文件在这件事上几乎毫无用处,我找不到有类似问题的人。请帮忙

当我将会话对象存储在servlet中并使用以下命令将请求转发到JSP时:

getServletContext().getRequestDispatcher("/example.jsp").forward(request,response);
一切正常。但当我将对象存储到会话并使用以下命令重定向请求时:

response.sendRedirect("/example/url");
会话对象将丢失到以太中。事实上,当我在新请求上转储会话键/值对时,绝对没有任何内容,会话对象只出现在创建会话对象的servlet的请求范围内。在我看来,这些对象并没有写入Memcache或Datastore。值得一提的是,在我的开发服务器上一切正常,但当我上传到appengine时,它就坏了。这让我相信这是一个配置问题

在为我的应用程序配置会话方面,我设置了

<sessions-enabled>true</sessions-enabled>
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>"; 
    }
}
import java.io.Serializable;
公共类FlashMessage实现了可序列化{
private static final long serialVersionUID=8109520737272565760L;//我尝试过使用不同的、默认的和无serialVersionUID
公共静态最终字符串会话\u KEY=“flashMessage”;
公共静态最终字符串ERROR=“ERROR”;
公共静态最终字符串SUCCESS=“SUCCESS”;
公共静态最终字符串无效。\u FORM\u DATA=“您的请求无法验证。”;
私有字符串消息;
私有字符串类型;
公共FlashMessage(字符串类型,字符串消息){
this.type=type;
this.message=消息;
}
公共字符串显示(){
返回“+消息+”;
}
}

也许您需要添加一个没有参数的默认构造函数。

我将日志级别调低到debug,发现AppEngine在其一个过滤器的destroy方法中抛出异常。这就是对象没有保存到会话的原因

我解决了异常,一切正常


希望这能帮助其他人。

您能使用数据存储浏览器查看数据存储中的会话对象吗?可能Flash类需要增强?刚刚找到数据存储浏览器,没有意识到。session中有许多条目。我可以从同一请求读取会话对象,但不能从新请求读取。
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>"; 
    }
}