我们遇到了一种情况,有时flash.message可以正确显示,但有时根本不显示。我将不胜感激有关如何进行故障排除的任何提示。
以下是我们控制器中的代码:
log.debug("missing required fields ${errorMsg}")
flash.error = errorMsg
...
log.debug("leaving moveToDraft with flash.message: ${flash.message} and
flash.error: ${flash.error}")
redirect(controller: 'challengeManagement', action: 'show', id:
challenge.challengeNumber)
这是查看代码的样子:
<g:if test="${flash.message}">
<div class="message"><%=flash.message%></div>
</g:if>
<g:if test="${flash.error}">
<div class="error"><%=flash.error%></div>
</g:if>
此代码始终对我的开发箱和测试系统有效,但对于我们的质量检查人员,大约一半的时间不显示Flash消息。从log.debug语句中,我已经确认它已被设置并且在离开控制器方法时具有价值。从页面上查看“查看源代码”,很显然div不存在。他们从来没有被写出来,这意味着测试条件一定失败了。
现在,在上述重定向之后确实发生了307重定向。因此,鉴于Flash对象的作用域有限,这可能是个问题……除了我还获得了307重定向,而且我总是在页面上看到flash.message / flash.error。
有什么方法可以调试Flash对象,以便可以看到清除它的时间?另外,是否有页面更详细地描述了该机制? (我读到它取决于Cookie,但在请求Cookie列表中看不到它)。关于如何解决问题还有其他想法或想法吗?
我的下一步是不使用Flash对象进行重写,但是我担心的是我不明白问题出在哪里,我们到处都使用Flash对象。
答案 0 :(得分:0)
回答我自己的问题,以防万一对别人有帮助。问题确实是307重定向。
对于除此特定浏览器版本以外的所有其他浏览器,307重定向均不会导致Flash对象被清除。在这个特定的浏览器版本中,它仅导致闪存清除了一部分时间,例如40%。我不知道为什么会这样,但是我毫无疑问地找到了它。 (我怀疑两个Apache重写规则之间存在竞争状况,但是我没有进一步调查。)
307是通过Apache服务器中的重写规则创建的,该规则将所有传入的HTTP请求重定向为https请求。因此,为我们提供的解决方案很简单:使我们的初始请求已经是https,这样它们就不会违反Apache重写规则。有两种方法:1)创建一个完整的uri,然后使用uri而不是通常的控制器/操作参数进行重定向
String baseUrl = ContextUtil.grailsBaseURL(true)
String uri = "${baseUrl}/challengeManagement/show/${challenge.challengeNumber}"
redirect (uri: uri)
2)添加一个spring安全配置变量,使它使用https而不是http
grails.plugin.springsecurity.secureChannel.definition = ['/**' :
'REQUIRES_SECURE_CHANNEL']