grails-2.0 - 有时 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 对象。
解决方案
回答我自己的问题,以防万一它帮助别人。问题确实是 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']
推荐阅读
- c++ - OpenCV - FAST+BRIEF:如何使用 DrawMatchesFlags::DRAW_RICH_KEYPOINTS 绘制关键点?
- asp.net-mvc - HTTP Get 上查询字符串中的可读数据
- java - 在用户计算机上的 sqlite DB 上使用 jdbc 设置相对路径
- functional-programming - Prolog 创建字典
- database - Kubernetes:如何管理具有多个副本的数据?
- java - 如何将以下 Java 代码转换为 Node.js?
- django - Django/Graphene/Apollo/django-webpack-loader/Vue:CORS/CSRF 不能一起工作?
- oracle - APEX_ITEM 仅显示一行
- vue.js - 页面重新加载后无法获取 Vuex getter 和突变中的状态
- python - 用于测试的无头 VTK