会话之间没有持续存在请求

时间:2010-06-09 11:12:32

标签: java google-app-engine session

我的会话对象仅存储在Google应用引擎的请求范围内,我无法弄清楚如何在请求之间保留对象。在这个问题上,文档几乎没用,我找不到任何遇到类似问题的人。请帮忙。

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

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

一切都像它应该的那样。但是当我将对象存储到会话并使用:

重定向请求时
response.sendRedirect("/example/url");

会话对象丢失到以太网。事实上,当我在新请求上转储会话密钥/值对时,绝对没有任何东西,会话对象只出现在创建会话对象的servlet的请求范围内。在我看来,对象没有写入Memcache或Datastore。值得一提的是,我的开发服务器上的一切正常,但是当我上传到App Engine时,它会中断。这让我相信配置存在问题。

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

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

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

会话文档的single paragraph还指出,只有实现Serializable的对象才能存储在请求之间的会话中。我在下面列出了一个代码示例。

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

示例:类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>"; 
    }
}

2 个答案:

答案 0 :(得分:2)

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

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

希望这可以帮助有人下线。

答案 1 :(得分:1)

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