4

複数のユーザーがいるPlayFramework1.2.5で実行されているアプリケーションがあります。

時折、ユーザーは数分前に機能していた特定のURLに対して324エラーを受け取り始めることがあります。(324 = Chromeでデータを受信しませんでした。サーバーは、IE8で接続を閉じました)。このメッセージを受信すると、引き続きエラーを受信します。

Play Frameworkが実行されているマシンに(Wireshark経由で)リクエストが到達しているのを確認できますが、リクエストがPlayコントローラーに到達していないようです。(コントローラーの最初のステップとしてのデバッグおよびトレースメッセージは、ログに出力されません)。2つの異なるコントローラーで問題が発生するのを見てきましたが、さらに影響が出る可能性があります。

ブラウザのキャッシュのクリア、履歴、クライアントの再起動、Playの再起動、サーバーの再起動はすべて違いがないようです。

他のブラウザは「壊れた」URLに正常にアクセスできます。「壊れた」クライアントは、同じアプリケーション内の他のURLにアクセスできます。

誰かが知っていますか:1)なぜこれが起こっているのか、または同じ問題が発生しているのかを知っていますか、または2)Playが爆撃または324を送信する可能性がある応答チェーンのどこかを知っていますか?2)何が問題になっているのかをより深く追跡するにはどうすればよいですか(たとえば、Nettyアクセスを追跡できますか?)

私は解決策に関する同様の問題を幅広く検索し、同様の324エラーを引き起こすルートファイル内のエラーへの参照をいくつか見つけることができますが、これらはすべて一貫性があり、再現可能であり、Play2.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を参照)。 -リクエストは処理されます)。そこのコメント欄で、二重引用符の問題は修正されましたが、サイズの問題は残っていることに気付くでしょう。

私の原因

では、どうやってそんなに大きな Cookie を生成できたのでしょうか? 回答: JQuery データテーブル。この素晴らしい UI 要素 (実際には違います) には「bStateSave」という設定があり、テーブルの状態 (順序付け、フィルタリングなど) を Cookie に保存して、ユーザー エクスペリエンスを向上させることができます。データテーブルの Cookie は約 900 バイトです。ただし、Datatables はこの Cookie の名前付けに URL のパス部分を使用するため、アプリケーション内の異なる URL パスごとに新しい Cookie を取得します。ここで、/item/show/34 (34 はオブジェクト ID) などの RESTful スタイルの URL と、表示するアイテムごとに 1 つの 900 バイトの Cookie である hey-presto をミックスに追加するだけです。これにより、すぐに 8K の制限がなくなります。

答え

データテーブル状態 Cookie の命名をオーバーライドするのは簡単ではありませんが、非常に簡単です。

まず、次の構成をデータテーブルに追加します

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

次に、独自のあまり正確でない Cookie 名を使用して、状態を保存および取得する JavaScript 関数を提供するだけです。

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 に答える