2010-06-09 97 views
1

我的會話對象只存儲在谷歌應用程序引擎的請求範圍內,我無法弄清楚如何在請求之間持久化對象。文檔在這個問題上是無用的,我找不到遇到類似問題的任何人。請幫忙。會話之間沒有堅持請求

當我會話對象存儲在servlet和使用將請求轉發給JSP:

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

一切工作像它應該。但是,當我將對象存儲到會話中並使用以下請求重定向請求時:

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

會話對象會丟到ether中。實際上,當我在新請求上轉儲會話密鑰/值對時,沒有任何內容,會話對象只出現在創建會話對象的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>"; 
    } 
} 
+0

您可以使用數據存儲瀏覽器查看數據存儲中的會話對象嗎?最前面有_ah_SESSION – 2010-06-09 11:28:41

+0

也許Flash類需要增強? – 2010-06-09 11:30:10

+0

剛剛找到數據存儲瀏覽器,但沒有意識到它 – klonq 2010-06-09 11:37:58

回答

2

我將日誌級別調低,發現AppEngine在其過濾器的銷燬方法中拋出了Exceptions。這就是爲什麼這些對象沒有被保存到會話中。

我解決了例外,一切正常。

希望這可以幫助別人。

+0

舊的應用程序引擎到它的技巧。 – 2010-06-09 14:50:42

1

也許你需要添加一個默認的構造函數不帶參數。

+0

我給了它一個鏡頭,沒有榮耀。 – klonq 2010-06-09 11:24:59

+0

嗯...只是一個猜測 – 2010-06-09 11:26:35