ใน HTML5 วัตถุ localStorage ถูกแยกออกต่อหน้า / โดเมนหรือไม่


172

วัตถุ HTML5 localStorage แยกได้ต่อหน้า / โดเมนหรือไม่ ฉันสงสัยเพราะฉันจะตั้งชื่อคีย์ localStorage ได้อย่างไร ฉันต้องการคำนำหน้าแยกต่างหากหรือไม่ หรือฉันจะตั้งชื่อพวกเขาในสิ่งที่ฉันต้องการ?


ฉันมักจะใช้คำนำหน้าเสมอเพื่อหลีกเลี่ยงการชนที่อาจเกิดขึ้นกับสคริปต์ผู้ใช้ - ซึ่งสามารถใช้ localStorage ด้วย
Benjol

IMO เป็นสคริปต์ผู้ใช้ที่ควรหลีกเลี่ยงการชนไม่ใช่ในหน้าเว็บ ในสคริปต์ผู้ใช้ของฉันฉันใช้คำนำหน้าชื่อหลังจากสคริปต์
Camilo Martin

คำตอบ:


195

เป็นต่อโดเมนและพอร์ต (กฎการแยกเดียวกันกับนโยบายกำเนิดเดียวกัน ) เพื่อให้ต่อเพจคุณจะต้องใช้รหัสตามlocationหรือวิธีการอื่น

คุณไม่จำเป็นต้องมีคำนำหน้าให้ใช้หากคุณต้องการ นอกจากนี้คุณยังสามารถตั้งชื่อสิ่งที่คุณต้องการ


77
มันไม่ซ้ำกันต่อการprotocol://host:portรวมกัน
thasmo

1
www.mysite.it:8012/App1 และ www.mysite.it:8012/App2 แบ่งปันที่เก็บข้อมูลในเครื่องหรือไม่
DarioN1

3
@ DarioN1 ใช่ www.mysite.it:8012/App1 และ www.mysite.it:8012/App2 ได้แบ่งปันที่เก็บข้อมูลในตัวเครื่อง (Caveat: หากคุณเข้าถึงโปรโตคอลที่แตกต่างกัน EG http vs https นั้นจะไม่ถูกแชร์ภายในโปรโตคอลเดียวกันโดเมนย่อยโดเมนและพอร์ต - พวกเขาแบ่งปันกันนี่เป็นแนวคิดของ 'Origin' ที่ทำให้เข้าใจง่าย )
วิลเลียม

31

ร้านค้ามีต่อต้นทางโดยที่ "แหล่งกำเนิด" เป็นเช่นเดียวกับนโยบายแหล่งกำเนิดสินค้าเดียวกัน (รวมถึงสคีมา [ httpvs. https, ฯลฯ ], พอร์ตและโฮสต์) จากสเป็ค :

บริบทการสืบค้นระดับบนสุดแต่ละอันมีชุดของพื้นที่เก็บข้อมูลเซสชันที่ไม่ซ้ำกันหนึ่งรายการสำหรับแต่ละจุดเริ่มต้น

ดังนั้นที่เก็บข้อมูลhttp://a.example.comและที่เก็บข้อมูลhttp://b.example.comแยกต่างหาก (และทั้งคู่แยกต่างหากhttp://example.com) เนื่องจากเป็นโฮสต์ที่แตกต่างกันทั้งหมด ในทำนองเดียวกันhttp://example.com:80และhttp://example.com:8080และhttps://example.comมีต้นกำเนิดที่แตกต่างกันทั้งหมด

ไม่มีกลไกที่สร้างไว้ในที่เก็บข้อมูลเว็บที่อนุญาตให้แหล่งกำเนิดหนึ่งเข้าถึงแหล่งเก็บข้อมูลอื่นได้

โปรดทราบว่าต้นกำเนิดไม่ URL ดังนั้นhttp://example.com/page1และทั้งสองมีการเข้าถึงที่จัดเก็บข้อมูลสำหรับhttp://example.com/page2http://example.com


3
นี่เขียนขึ้นอย่างมากชอบคำตอบนี้มากที่สุดเพราะง่ายต่อการอ่านและอธิบายอย่างครบถ้วนแม้สำหรับผู้ที่เพิ่งจะเริ่มพัฒนา
baHI

1
+1 สำหรับการกล่าวถึงว่า "ไม่มีกลไกใดที่สร้างไว้ในที่เก็บข้อมูลบนเว็บที่อนุญาตให้แหล่งกำเนิดหนึ่งเข้าถึงแหล่งเก็บข้อมูลอื่น"
Fabien Quatravaux

7

ใช่แต่ละโดเมน / โดเมนย่อยมีlocalStorage ที่แตกต่างกันและคุณสามารถโทรหาคีย์ได้ตามที่คุณต้องการ (ไม่ต้องใช้คำนำหน้า)

ในการรับรหัสคุณสามารถใช้ปุ่มวิธี (ดัชนี) เช่น

localStorage.key(0);

มีวัตถุที่เรียกว่าglobalStorageก่อนที่คุณจะมีหลาย localStorages ได้ แต่มันถูกคัดค้านจากข้อกำหนด


7

ตามที่คนอื่น ๆ ได้ระบุไว้ localStorage นั้นไม่ซ้ำกันต่อโปรโตคอลโฮสต์และพอร์ต หากคุณต้องการเป็นวิธีที่สะดวกในการควบคุมการจัดเก็บข้อมูลของคุณด้วยปุ่มนำหน้าผมขอแนะนำให้localDataStorage

ไม่เพียงช่วยในการบังคับใช้พื้นที่จัดเก็บข้อมูลแบบแบ่งส่วนภายในโดเมนเดียวกันโดยใช้คีย์นำหน้า แต่ยังเก็บประเภทข้อมูลจาวาสคริปต์ (Array, Boolean, Date, Float, Integer, String และ Object) ให้ข้อมูลที่ไม่ชัดเจนบีบอัดสตริงโดยอัตโนมัติและ อำนวยความสะดวกในการสืบค้นโดยใช้คีย์ (ชื่อ) เช่นเดียวกับค่าการสืบค้นโดย (คีย์)

[การปฏิเสธความรับผิด] ฉันเป็นผู้เขียนโปรแกรมอรรถประโยชน์ [/ การปฏิเสธความรับผิด]

ตัวอย่าง:

// instantiate our first storage object
// internally, all keys will use the specified prefix, i.e. passphrase.life
var localData = localDataStorage( 'passphrase.life' );

localData.set( 'key1', 'Belgian' )
localData.set( 'key2', 1200.0047 )
localData.set( 'key3', true )
localData.set( 'key4', { 'RSK' : [1,'3',5,'7',9] } )
localData.set( 'key5', null )

localData.get( 'key1' )   -->   'Belgian'
localData.get( 'key2' )   -->   1200.0047
localData.get( 'key3' )   -->   true
localData.get( 'key4' )   -->   Object {RSK: Array(5)}
localData.get( 'key5' )   -->   null


// instantiate our second storage object
// internally, all keys will use the specified prefix, i.e. prismcipher.com
var localData2 = localDataStorage( 'prismcipher.com' );

localData2.set( 'key1', 123456789 )  // integer

localData2.get( 'key1' )   -->   123456789

อย่างที่คุณเห็นค่าดั้งเดิมนั้นได้รับการเคารพและคุณสามารถสร้างหลาย ๆ กรณีเพื่อควบคุมที่เก็บข้อมูลของคุณ


0

มันสามารถใช้ได้ทุกที่บนโดเมนนั้นตามที่ Nick แนะนำเนื่องจากเป็นทางเลือกหนึ่งที่มี sessionStorage ทำงานแตกต่างกันเล็กน้อยซึ่งแตกต่างจากหน้าต่างเบราว์เซอร์เอง กล่าวคือแท็บหรือหน้าต่างอื่น ๆ ในโดเมนเดียวกันไม่มีสิทธิ์เข้าถึงสำเนาเดียวกันของวัตถุหน่วยเก็บข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.