首页 > 解决方案 > 有时 flash.message 显示,有时不显示

问题描述

我们遇到过有时会正确显示 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>

这段代码在我的开发箱和测试系统上总是适用于我,但对于我们的 QA 人员来说,大约有一半的时间没有显示 flash 消息。从 log.debug 语句中,我已经确认它正在设置并且在离开控制器方法时具有价值。从页面查看“查看源代码”,很明显 div 不存在。他们从未被写出来,这意味着测试条件一定失败了。

现在,在上述重定向之后确实会发生 307 重定向。所以,考虑到 flash 对象的范围有限,这可能是一个问题......除了我也得到 307 重定向并且我总是在页面上看到 flash.message/flash.error。

有什么方法可以调试 flash 对象,以便我可以看到它何时被清除?另外,是否有更详细地描述机制的页面?(我读到它取决于 cookie,但我在请求 cookie 列表中没有看到它)。关于如何排除故障的任何其他想法或想法?

我的下一步是在不使用 flash 对象的情况下进行重写,但我担心的是我不明白问题出在哪里,而且我们到处都使用 flash 对象。

标签: grails-2.0

解决方案


回答我自己的问题,以防万一它帮助别人。问题确实是 307 重定向。

对于除此特定浏览器版本之外的所有其他浏览器,307 重定向不会导致 flash 对象被清除。而在这个特定的浏览器版本中,它只会导致 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']

推荐阅读