我在Google App Engine的应用程序中遇到Stripes表单问题。
我有一个带有Stripes表单标签的JSP页面。当我提交表单并在其中一个字段上发生验证错误时,Stripes向我显示一个屏幕,并显示以下通知:
就是这样。
需要有人(可能是Stripes Dispatcher)来获得
源页面分辨率。但没有提供源页面
请求,除非您覆盖
您将需要ActionBeanContext.getSourcePageResolution()
值。当您使用标签时,称为“ _sourcePage”的隐藏字段是
包括在内。如果您编写自己的表格或链接可能会产生
验证错误,您必须为此参数包含一个值。这个
可以通过调用request.getServletPath()来完成。”
我已经使用表单检查了页面的源,并且表单中应该存在隐藏的输入字段_sourcePage。该字段的值似乎已被加密。
最佳答案
加密发送到客户端的值(隐藏的表单字段等)是Stripes功能之一,这是造成问题的原因。
加密和解密值Stripes使用一个密钥,该密钥在名为Stripes.EncryptionKey的配置属性中指定。
此属性没有默认值,因此,如果未指定默认值,则Stripes每次生成
应用程序已初始化。
在传统的应用程序服务器上,这不是问题,而且由于安全性增强而受到欢迎,因为
密钥不时更改。
另一方面,在Google App Engine上,这是一个主要问题。在GAE上,无法保证
一个用户会话范围内的后续请求将由具有相同生成密钥的同一应用程序提供。
App Engine可以决定随时关闭任何正在运行的应用程序实例,如果下一个请求到来,它会
将启动另一个实例来处理请求(这称为“冷启动”)。这个新实例将具有新生成的密钥。
结果是应用程序将尝试使用不同于和加密的密钥来解密这些值。
没有这样做。
在这种情况下,Stripes会记录警告“输入未使用当前的加密密钥进行加密:”,并且其行为表现为完全不存在要尝试解密的参数
(请参见net.sourceforge.stripes.util.CryptoUtil)。在您的情况下,这意味着它的行为就像_sourcePage参数不存在并且
这就是为什么如果发生验证错误,它会显示“这里是”屏幕的原因。
因此,如果您在Google App Engine上使用Stripes,则应为配置属性Stripes.EncryptionKey设置一些随机值。