セッションストアの「継承」について
4483 ワード
問題の再現
最近バグを書く過程で面白いことを発見し、私はそれを「
テスト1
aページと呼ばれるページを開き、コンソールで実行します.
新しく開いたページをbページと呼び、bページコンソールで実行します.
私の認識では、
初歩的な分析
私の認知テストに従ってみました.
テスト2
aページで実行
それからaページのurlをコピーして、新しいtabページを作ってこのurlを開いて、実行します
ええ、私の認識も正しいですが、全面的ではなく、特定のシーンでの補充が欠けています.そして私はこれについてさらに探求しました.テスト1に基づいて続けます.
テスト3
aページコンソールで実行
bページで実行
これにより、総合テスト1、2、3では、aページで
この時私はまた、aページで開いているのが
テスト4
aページ(非
cページの
したがって、以上をまとめると、aページで
大体このような結論です.では、ドキュメントを見て、ドキュメントがこの結論に言及しているかどうかを見てみましょう.
ドキュメントサポート
この質問how-to-prevent-sessionstorage-being-inherited-when-using-target-blank-windowの答えで見つけた対応するドキュメントの説明を検索しました.
When a new Document is created in a browsing context which has a top-level browsing context, the user agent must check to see if that top-level browsing context has a session storage area for that document's origin. If it does, then that is the Document's assigned session storage area. If it does not, a new storage area for that document's origin must be created, and then that is the Document's assigned session storage area. A Document's assigned storage area does not change during the lifetime of a Document.
これは
A
browsing contextis the environment in which a browserdisplays a
Each browsing context has a specificorigin, host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match."), the origin of the active document, and a history that lists all the displayed documents in order.
簡単に理解すると、1つの
Web content's origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.
簡単に理解すると、これが私たちがよく言うドメインです.
この2つの概念を理解してから、このドキュメントを見てください.これは私たちがテストした結論と同じです.もっと簡単なまとめです.
aページの
これが
その他
ドキュメントを調べる過程で、
リファレンスドキュメント API/Using_the_Web_Storage_API API/Window/sessionStorage プロジェクトで踏んだ穴の-sessionStorage how-to-prevent-sessionstorage-being-inherited-when-using-target-blank-window the-sessionstorage-attribute origin Browsing_context
最近バグを書く過程で面白いことを発見し、私はそれを「
sessionStorage
'継承」と呼んでいます.このプロセスは、次のように再現できます.テスト1
aページと呼ばれるページを開き、コンソールで実行します.
sessionStorage.a = 'a';
window.open(window.location.href); // b
新しく開いたページをbページと呼び、bページコンソールで実行します.
sessionStorage // , window sessionStorage
// {a: "a", length: 1}
私の認識では、
sessionStorage
はページレベルであり、ページとページの間には互いに影響しないと考えられています.上記の例では、私が期待する出力は、このような「継承」のような表現ではなく、length
の属性しかないはずです.これは私の認識と違います.調べなければなりません.ドキュメントを調べる前に、この問題を簡単に探求し、分析します.初歩的な分析
私の認知テストに従ってみました.
テスト2
aページで実行
sessionStorage.a = 'a';
それからaページのurlをコピーして、新しいtabページを作ってこのurlを開いて、実行します
sessionStorage
// {length: 0}
ええ、私の認識も正しいですが、全面的ではなく、特定のシーンでの補充が欠けています.そして私はこれについてさらに探求しました.テスト1に基づいて続けます.
テスト3
aページコンソールで実行
sessionStorage.a = 'aaaaaaaa';
sessionStorage.b = 'b';
bページで実行
sessionStorage
// {a: "a", length: 1}
これにより、総合テスト1、2、3では、aページで
window.open(window.location.href)
を介して得られたbページのsessionStorage
に、aページの現在のsessionStorage
の独立したコピーがあり、その後、aページのsessionStorage
を変更してもbページのsessionStorage
に影響を与えないという情報が得られるだろう.この時私はまた、aページで開いているのが
window.location.href
のようなアドレスではなく、別のアドレスであれば、localStorage
とcookie
に対する私たちの理解によれば、ここにもドメインの制限があるはずだと思います.次にテストしますテスト4
aページ(非
https://baidu.com
)で個別のドメインのアドレスを開いてcページを得るwindow.open('https://baidu.com'); // c
cページの
sessionStorage
を見ると、aページsessionStorage
の値はありません.うん、この点は私たちの認識と同じで、この「継承」も同域の場合にしか起こらない.したがって、以上をまとめると、aページで
window.open()
を介して同ドメインアドレスから得られたbページを開くと、bページにはaページの現在のsessionStorage
の独立したコピーがあり、この2つのsessionStorage
は互いに影響しないという情報を得ることができる.大体このような結論です.では、ドキュメントを見て、ドキュメントがこの結論に言及しているかどうかを見てみましょう.
ドキュメントサポート
この質問how-to-prevent-sessionstorage-being-inherited-when-using-target-blank-windowの答えで見つけた対応するドキュメントの説明を検索しました.
When a new Document is created in a browsing context which has a top-level browsing context, the user agent must check to see if that top-level browsing context has a session storage area for that document's origin. If it does, then that is the Document's assigned session storage area. If it does not, a new storage area for that document's origin must be created, and then that is the Document's assigned session storage area. A Document's assigned storage area does not change during the lifetime of a Document.
これは
html
の標準ドキュメントです(ブラウザメーカーに見せる実装規範だと理解しています).この中には2つの概念が説明されています.browsing context
という概念文書はこう説明されていますA
browsing contextis the environment in which a browserdisplays a
Document
(normally a tab nowadays, but possibly also a window or a frame within a page). Each browsing context has a specificorigin, host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match."), the origin of the active document, and a history that lists all the displayed documents in order.
簡単に理解すると、1つの
tab
ページ、1つのframe
は1つのbrowsing context
である.document's origin
このドキュメントにも説明がありますWeb content's origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.
簡単に理解すると、これが私たちがよく言うドメインです.
この2つの概念を理解してから、このドキュメントを見てください.これは私たちがテストした結論と同じです.もっと簡単なまとめです.
aページの
window.open()
を介して開かれた同ドメインページには、aページの現在のsessionStorage
の独立したコピーがある.これが
sessionStorage
継承問題のように見える解釈です.もちろんここの継承も本当の継承ではありませんが、このように見えます.その他
ドキュメントを調べる過程で、
を避けようとする兄もいることに気づきました.もちろん、この回避方法にも言及されています(個人的な感覚は優雅ではありません).新しく開いたbページloadが終わった後、sessionStorage
をリセットして、前のページの影響を受けないようにします.リファレンスドキュメント