これは重複としてマークされる可能性が高いことを知っていますが、探しているものを正確に見つけることができませんでした
これは一般的な問題であり、明確に定義されたベストプラクティスソリューションがあるはずです。
バックグラウンド
単一ページのSaaSアプリ、ドラッグアンドドロップがたくさんあり、ユーザーは一定期間サーバー通信がなくてもアプリを操作できます
サーバーセッションは、非永続的なセッションCookieを使用して、ユーザーオブジェクトのみを保持します
X時間後にサーバーでセッションが期限切れになる
ログイン時にのみ読み込まれるもの
問題
- ユーザーはアプリで作業し、完了してもログアウトせず、ブラウザーを開いたままにします
- ユーザーがX時間を超えて戻ってきた(セッションがサーバーで無効になっている)
- ユーザーはサーバー接続を必要とせずにアプリと対話します(ドラッグアンドドロップ、テキスト編集など)
- 次のサーバーとの対話時のみ(自動保存がないと仮定)、ユーザーはログインページにスローされ、一部の作業が失われます
可能な解決策
私が考えているいくつかの解決策があります。他に解決策があるかどうか、そして根本的に何か問題があるかどうかを聞きたいです。
1.ユーザーをログアウトしないでください
- どうやって?長いセッションを維持する、永続的なcookieを維持する、またはjavaScriptの「キープアライブ」ping
- 長所:ユーザーは何も心配する必要がなく、問題を修正します
- 短所:PCIに準拠せず、安全ではなく、開発の変更が必要です。たとえば、ユーザーのログイン時にのみセッションに読み込まれるものは、pubサブモデル(イベントの変更をリッスンする)に移動するか、キャッシュタイムアウトを持つ必要があります。
2.ローカルストレージ
- どうやって?ログアウトした場合、新しいローカルストレージを使用して状態を一時的に保存し、ログインページにリダイレクトし、ログイン後も保持する
- 長所:セッションタイムアウトの処理だけでなく、「オフライン作業」サポートのベース
- 短所:実装が難しく、データツリーの状態マージを行う必要がある、すべてのブラウザがサポートするわけではない
3.自動保存
モデルを変更するすべてのユーザーアクションは、すぐに(またはクライアント側のキューを介して)永続化する必要があります。たとえば、ユーザーがチェックボックスをオンにしたり、テキストフィールドを変更したり、何かをドラッグアンドドロップしたりすると、変更が永続化されます。
- どうやって?MV **フレームワーク(Backbone.js / Knockout.js / Ember.js / Angular.jsなど)を使用してモデルをバインドし、変更を維持します。
- 長所:クリーンなソリューションのようです。ユーザーがアクティブである限りセッションはアクティブであり、永続化せずにクライアント側の作業は行われません。
- 短所:セッションタイムアウトが失われた後、ユーザーが最後に行ったアクション。
4.セッションの有効期限が切れた後、ユーザーをログアウトします
これにはいくつかのアプローチがあります
サーバーに「セッションの期限が切れています」と尋ねます。これは、サーバーへの単なる質問がセッションを延長する(タイムアウトを再開する)ため、ちょっとしたキャッチ22 /シュレディンガーの猫です。
- どうやって?そのような質問をサポートするサーバーを持っているか(私は知りませんが、Javaランドから来ます)、またはセッションIDのテーブルと最終アクセス時間を手動で保持し、セッションを渡すことによってサーバーに問い合わせることができますCookieの代わりにパラメーターとしてIDを使用します。これが可能かどうかはわかりませんが、危険で、安全でなく、設計が間違っているようです。
- 長所:サーバーにそのようなネイティブサポートがあった場合、クリーンで正当な質問のように聞こえます(ユーザーXがまだセッションを持っているかどうかを尋ねます)
- 短所:サーバーがそれをサポートしていない場合(そして、サーバーやフレームワークにこの機能があるかどうかはわかりません)、回避策には潜在的に大きなセキュリティリスクがあります。
私が聞いた1つの回避策は、サーバー側での短いセッションと、最大数のpingを持つキープアライブクライアント側のpingです。
- どうやって?サーバー上の短いセッション、クライアントはすべてのsessionTimeOut / 2にpingを実行し、最大再試行回数はYです。
- 長所:問題の修正の種類、迅速で汚い
- 短所:サーバーに任せるのではなく、自分でセッションの更新を処理するハックのように感じる
クライアント側タイマー
どうやって?クライアント側にタイマーを設定し、すべてのリクエストで再起動してサーバーのタイマーと同期させ、最大サーバーセッションタイムアウトからパディングを差し引いた値に等しくします。ユーザーがサーバーにリクエストを送信していない後、UIに「セッションは間もなくタイムアウトします。続けますか?」(あなたがオンラインバンキングに持っているように)
長所:問題を修正します
- 短所:同期が機能することを確認する必要性以外は考えられません
質問
上記の分析で何か見落としているかもしれませんし、ばかげた間違いがあるかもしれません。それらを修正してください。このために他にどのような解決策がありますか?
now
ます。4.2サーバーを停止してコストを増やすのに最適な方法のように聞こえます4.3 Androidでホーム画面に戻ると、プロセスが一時停止していて、クライアント側のタイマーに干渉する可能性があります。