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

请求之间不持续的会话

  •  1
  • klonq  · 技术社区  · 14 年前

    我的会话对象只存储在Google应用程序引擎的请求范围内,我不知道如何在请求之间持久化对象。这些文件在这件事上几乎毫无用处,我找不到任何经历过类似问题的人。请帮忙。

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

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

    一切正常。但是,当我将对象存储到会话并使用以下方法重定向请求时:

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

    会话对象将丢失到乙醚中。实际上,当我在新请求上转储会话键/值对时,绝对没有什么,会话对象只出现在创建会话对象的servlet的请求范围内。在我看来,对象没有被写入memcache或datastore。值得一提的是,在我的开发服务器上一切正常,但当我上传到应用引擎时,它就坏了。这让我相信这是配置问题。

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

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

    在appengine-web.xml中。我还缺什么吗?

    这个 single paragraph 关于会话的文档也注意到,只有实现可序列化的对象才能存储在请求之间的会话中。我已经包含了下面不起作用的代码示例。

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

    示例:类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 回复  |  直到 14 年前
        1
  •  2
  •   klonq    14 年前

    我调低日志级别进行调试,发现AppEngine在它的一个过滤器的销毁方法中抛出了异常。这就是为什么对象没有保存到会话中。

    我解决了例外情况,一切正常。

    希望这能帮助下一代。

        2
  •  1
  •   chickeninabiscuit    14 年前

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