2011-10-15 96 views
2

我在Google App Engine應用程序中的條紋表單存在問題。 我有一個帶有Stripes表單標籤的JSP頁面。當我提交表單並且在其中一個字段上出現驗證錯誤時,Stripes向我顯示一個屏幕,其中包含以下通知:Google App Engine問題條紋

以下是它的情況。

需要獲得 源頁面解析度的人(很可能是Stripes Dispatcher)。但是 請求中沒有提供源頁面,除非您覆蓋 ActionBeanContext.getSourcePageResolution(),否則您將需要該值爲 值。當您使用標籤時,名爲'_sourcePage'的隱藏字段爲 。如果您編寫自己的表單或可能會生成驗證錯誤的鏈接,則必須爲此參數包含一個值。這 可以通過調用request.getServletPath()來完成。」

我已經檢查與形式和隱藏的輸入字段_sourcePage頁面的源存在於理所應當的形式。該領域的價值似乎以某種方式加密。

+0

但是表格是如何提交的?有些JavaScript代碼可能會提交表單而不使用此隱藏字段?我在GAE上部署了一個Stripes應用程序,並且它按預期工作。用FireBug檢查隱藏域是否確實被提交。 –

+0

沒有javascript綁定來形成可以移除sourcePage字段的提交。我用Firebug檢查過它,它被髮送 – lukelazarovic

回答

5

被髮送到客戶端(隱藏的表單字段等)的值的加密是的條紋特徵中的一個和它的問題的一個原因。

加密和解密條紋使用值鍵,這是在名爲Stripes.EncryptionKey的配置屬性中指定的。 該屬性不具有hav e默認值,所以如果沒有指定,每次 應用程序初始化時,Stripes都會生成隨機密鑰。

這不一定是傳統應用服務器上的問題,而且它可以被歡迎的安全性增強,因爲 鍵不時地改變。

另一方面,在Google App Engine上,這是一個主要問題。在GAE上,不保證在一個用戶會話範圍內的後續請求將由具有相同生成密鑰的相同應用程序提供服務。 App Engine可以隨時決定關閉應用程序的任何運行實例,並且如果下一個請求到達,它將啓動另一個實例來爲請求提供服務(這稱爲「冷啓動」)。這個新實例將有新的生成密鑰。 結果是,應用程序將試圖用不同的密鑰解密這些值,而不是用加密的密鑰來解密這些值,當然 也沒有這樣做。

在這種情況下條紋記錄警告「輸入沒有與當前的加密密鑰加密」,並表現爲它的嘗試解密參數不存在於所有 (見net.sourceforge.stripes.util.CryptoUtil)。在你的情況下,這意味着它的行爲像_sourcePage參數不存在,這就是爲什麼它顯示「這是怎麼回事」屏幕,如果驗證錯誤發生。

因此,如果您在Google App Engine上使用Stripes,則應該將一些隨機值設置爲配置屬性Stripes.EncryptionKey。

+0

你在哪裏/如何設置它?它在'Stripes.properties'文件中嗎? –

+1

對於其他人來說,CryptoUtil的javadoc解釋了它:你可以在web.xml中設置它。 –