16

驚いたことに、モバイルデバイスでセッションCookieがどのように動作するかについての私の考えは、現実によって覆されていることに気づきました。

通常のデスクトップブラウザでは、ブラウザセッションがアクティブである限り、セッションCookieを保存するように動作します。最後のブラウザウィンドウ/プロセスが閉じている場合は、セッションを閉じる必要があります。

現在、モバイルデバイスでは、ブラウザアプリを閉じることはほとんどなく、バックグラウンドに送信するだけです。

Android4を搭載したSonyXperiaRayで、ブラウザプロセスを削除しても、セッションCookieの有効期限が切れていないことを発見しました。しかし、SamsungTabletデバイスではそうなります。iOSデバイスがそのように動作するかどうかはわかりません。

これは問題だ!?それを回避するにはどうすればよいですか?

今のところ、Cookieを1日で期限切れにすることにしました。しかし、私はそれにはあまり満足していません。
寿命を短くする必要がありますか?おそらく8時間まで?

4

5 に答える 5

5

HTML5の方法でsessionStorageを使用するのは理にかなっていますか?

HTML5セッションストレージはウィンドウごとであるため、この方法では、さまざまなデバイスがブラウザセッションを処理する方法に依存せず、ブラウザウィンドウの存続期間に制限されます。

基本的に、すべてのモバイルデバイスはsessionStorageをサポートし(ここを参照)、jQuery-Session-Plugin(このリンクをたどる)のようなフレームワーク/プラグインでセッションデータを処理することができます(そして、そうでない古いブラウザーのセッションCookieへのフォールバックを提供します) sessionStorageをサポート)。

編集:sessionStorageとlocalStorageの動作を示すために、(デモンストレーションの目的で)sessionStorageを使用してdivの幅を格納し、localStorageを使用して同じdivの高さを格納するフィドルを作成しました。

var randomWidth,
    randomHeight;
if (!(randomWidth= $.session.get("randomWidth"))) {    // assignment
    randomWidth = Math.random() * 300;
    $.session.set("randomWidth", randomWidth, true);
    console.log("just assigned and stored in sessionStorage: randomWidth: " + randomWidth);
} else {
    console.log("from sessionStorage: randomWidth: " + randomWidth);
}
if (!(randomHeight= $.domain.get("randomHeight"))) {    // assignment
    randomHeight = Math.random() * 300;
    $.domain.set("randomHeight", randomHeight, true);
    console.log("just assigned and stored in localStorage: randomHeight: " + randomHeight);
} else {
    console.log("from localStorage: randomHeight: " + randomHeight);
}
$(".test").css({width: randomWidth, height: randomHeight});

コンソールを見てください。クライアントブラウザの新しいセッションを開始すると、幅は変化しますが、高さは同じままです(ローカルストレージはドメインごとにあるため)。

これがjsfiddleへのリンクです

于 2013-03-13T16:45:53.573 に答える
5

同様の問題に対する私の解決策はdocument.referrer、Cookieと組み合わせて使用​​することでした。ユーザーがサイト内を移動している場合は、Cookieが存在する場合は引き続き使用します。それ以外の場合は、Cookieを期限切れにするか置き換えます。

ただし、ユーザーがサイトにいるときにブラウザをバックグラウンドに置いた場合でも、問題は解決しません。彼らがブラウジングを再開し、あなたのサイトのリンクを使用するだけの場合、Cookieは引き続き使用されます。

于 2013-03-15T17:53:58.900 に答える
4

この問題はモバイルデバイスに限定されません。ユーザーが常に「前のセッションを復元する」ことを選択した場合、セッションCookieはデスクトップブラウザーでも「永久に」持続する可能性があります(これは難しい方法で学びました)。

セッションを1日に制限するクライアント側のソリューションは次のとおりです。

2つのCookieを設定します。

  • (ブラウザ-)セッションCookie、および
  • ユーザーの深夜(たとえば、午前4時または午前5時)に期限切れになるCookie。たとえば、設定されてから2時間から26時間の間に期限切れになります(通常、xとxの間のウィンドウで期限切れになります。 x + 24時間)

いずれかのCookieが欠落している場合は、新しいセッションを開始し、両方をリセットします。

2番目のCookieを設定するには、を使用できますDate.getTimezoneOffset()。または、ユーザーの経度を少なくとも大まかに見積もることができるようにユーザーを確実に地理的に特定できる場合は、経度を使用して、「ユーザーの夜の真ん中」がいつになると予想されるかを計算できます(1時間は15度です)。経度の)。2つの可能性があります:IPアドレス(国を知るだけでは不十分かもしれませんが、米国のような国では少なくとも州レベルが必要です)、またはCDNが提供する情報を使用する場合はそれを使用します。

何かがしばらくして期限切れにならなければならない場合(たとえば、サーバー上のセッション)、Cookieに依存できない場合は、サーバー側でも期限切れを確認する必要があることに注意してください。

于 2013-03-18T20:49:19.577 に答える
2

場所を覚えておきたいかどうかユーザーに尋ねます。Cookieの有効期限をサーバーのタイムアウトに設定しない場合。ユーザーエクスペリエンスを選択する選択肢をユーザーに提供します。

onbeforeunloadイベントにアタッチしてサーバーに投稿し、Cookieの有効期限を変更するか、Cookieが安全でない場合は、Javaスクリプトから削除してください。

于 2013-03-14T21:04:25.943 に答える
1

これは少し汚い提案であり、決してばかげた証拠ではありませんが、言及する価値があると思います。アイドリング中にインターネットに接続したままの電話はありませんでした(バッテリーなどを節約するためにすべて切断されました)。モバイルネットワークはIPアドレスを非常に迅速にリサイクルします。

IPアドレスをセッションデータに保存し、おそらく最後にアクセスしたタイムスタンプと組み合わせて、IPアドレスが変更された場合にセッションを破棄/再開することは価値があるかもしれません。

明らかに、これはクライアントがWi-Fiではなくモバイルネットワークを介して接続されていることを前提としています。

于 2013-03-18T21:22:39.753 に答える