4

我有一个在 Play Framework 1.2.5 中运行的应用程序,有多个用户。

有时,用户会开始收到几分钟前对他们有用的特定 URL 的 324 错误。(324 = Chrome 中没有收到数据,服务器在 IE8 中关闭了连接)。一旦他们收到此消息,他们将继续收到错误。

我可以看到请求到达了运行 Play Framework 的机器(通过 Wireshark),但请求似乎没有到达 Play 控制器。(作为控制器第一步的调试和跟踪消息不会输出到日志)。我已经看到两个不同的控制器出现问题,它可能会影响更多。

清除浏览器缓存、历史记录、重新启动客户端、重新启动 Play、重新启动服务器似乎都没有任何区别。

其他浏览器可以成功访问“损坏”的 URL。“损坏”的客户端可以访问同一应用程序中的其他 URL。

有谁知道:1)知道为什么会发生这种情况,或者遇到过同样的问题,或者 2)有谁知道 Play 在响应链中的哪个位置可能会爆炸或发送 324?2) 我如何能更深入地追踪问题所在(例如,我可以追踪 Netty 访问吗?)

我已经广泛搜索了解决方案的类似问题,并且只能在路由文件中找到一些导致类似 324 错误的错误的引用,但这些似乎都是一致和可重复的,并且与 Play 2.x 相关。但是错误的路由会导致 324 错误这一事实意味着我很想更详细地了解路由器对这些损坏的请求做了什么。

非常感谢任何帮助!这让我发疯!

4

1 回答 1

2

好的,以防万一其他人看到这个令人愤怒的问题......我已经找到了原因:

根本原因

Netty 3.2.4-FINAL 中的一个已知问题意味着如果请求包含 8053 字节或更大的 cookie,它会回复 324 响应。这在 Play Framework 社区中是众所周知的(参见http://play.lighthouseapp.com/projects/57987/tickets/1618-long-cookies-with-double-quote-values-make-play-fail-before-the -request-is-handled)。您会在那里的评论跟踪中注意到,双引号问题已修复,但大小问题仍然存在。

我的事业

那么,我是如何设法生成这么大的 cookie 的呢?答:JQuery 数据表。这个奇妙的 UI 元素(不,真的)有一个名为“bStateSave”的设置,允许您将表的状态(排序、过滤等)保存在 cookie 中,以改善用户体验。数据表的 cookie 大约 900 字节。但是,Datatables 在命名该 cookie 时使用 URL 的路径部分,因此对于应用程序中的每个不同 URL 路径,您都会获得一个新的 cookie。现在只需添加一个 RESTful 样式的 URL,例如 /item/show/34(其中 34 是一个对象 id)和嘿-presto,一个 900 字节的 cookie 用于您查看的每个项目。这很快打破了 8K 的限制。

答案

覆盖数据表状态 cookie 的命名并非易事,但它非常简单。

首先,将以下配置添加到您的数据表中

"bStateSave": true,
"fnStateSave": function(oSettings, oData) { save_dt_view(oSettings, oData); },
"fnStateLoad": function(oSettings) { return load_dt_view(oSettings); },

然后只需提供将存储和检索状态的 javascript 函数,使用您自己的不太精确的 cookie 名称:

function save_dt_view (oSettings, oData) {
    $.cookie('DataTables_myCookie', JSON.stringify(oData));
}
function load_dt_view (oSettings) {
  return JSON.parse( $.cookie('DataTables_myCookie') );
}

感谢本文中的 bennybenben提供了我蚕食的代码示例。

于 2013-03-11T21:34:53.250 回答