有时显示flash.message,有时不显示

时间:2018-11-28 18:11:35

标签: grails-2.0

我们遇到了一种情况,有时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对象。

1 个答案:

答案 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']