Play框架1.2.5粘性错误:324未接收到数据

4
我有一个应用程序在Play Framework 1.2.5中运行,有多个用户。
偶尔,某个用户会在几分钟前可以使用的特定URL上收到324错误。(324 = Chrome中的NO DATA RECEIVED,IE8中的SERVER CLOSED THE CONNECTION)。一旦他们收到这个消息,他们就会继续收到错误。
我可以看到请求到达运行Play Framework的机器(通过Wireshark),但请求似乎没有到达Play控制器。(控制器中第一步的调试和跟踪消息不会输出到日志中)。我已经看到了两个不同控制器出现的问题,它可能影响更多。
清除浏览器缓存、历史记录、重新启动客户端、重新启动Play、重新启动服务器似乎都没有任何区别。
其他浏览器可以成功访问“损坏”的URL。“损坏”的客户端可以访问同一应用程序中的其他URL。
有人知道: 1)知道为什么会发生这种情况,或者遇到过同样的问题,或者 2)任何人知道在响应链中Play可能会出错或发送324? 3)我如何更深入地追踪出错原因(例如,我能追踪Netty访问吗?)
我已经搜寻了很多类似的问题及其解决方案,只发现一些与路由文件中的错误导致类似的324错误的参考资料,但这些都似乎是一致和可重复的,并且与Play 2.x有关。但是,一个不良路线可以导致324错误的事实意味着我很想更详细地了解路由器对这些错误请求做了什么。
非常感谢任何帮助!这让我发疯!
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 Datatable。这个非常棒的UI元素(真的)有一个称为“bStateSave”的设置,允许你将表格的状态(排序、过滤等)保存在cookie中,以提高用户体验。 Datatable的cookie大约为900字节。 然而,Datatables使用URL路径的部分来命名此cookie,因此对于您应用程序中的每个不同的URL路径,您都会得到一个新的cookie。 现在再加入RESTful风格的URL,例如/item/show/34(其中34是对象ID),嘿,每个查看的项目都有一个900字节的cookie。这很快达到了8K的限制。

答案

覆盖datatables状态cookie的命名并不是微不足道的,但它非常简单。

首先,请向您的datatable添加以下配置

"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在这篇帖子中提供的代码示例,我进行了改编。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接