【问题标题】:Sessions not persisting between requests会话在请求之间不持久
【发布时间】:2011-03-01 14:51:16
【问题描述】:

我的会话对象只存储在谷歌应用引擎的请求范围内,我不知道如何在请求之间持久化对象。文档在这个问题上几乎没用,我找不到遇到类似问题的人。请帮忙。

当我将会话对象存储在 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>"; 
    }
}

【问题讨论】:

  • 您可以使用数据存储浏览器查看数据存储中的会话对象吗? Apperntly 前缀为 _ah_SESSION
  • 也许 Flash 类需要增强?
  • 刚刚找到数据存储浏览器,不知道
  • 是的,会话中有很多条目
  • 我可以从同一个请求中读取会话对象,但不能从新请求中读取。

标签: java google-app-engine session


【解决方案1】:

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

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

希望这可以帮助某人。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 2017-01-08
      • 2013-08-22
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多