คุกกี้และเซสชันมีวัตถุประสงค์เพื่อรักษาสถานะการเข้าถึงผู้ใช้ ในอีกด้านหนึ่งมันคือการอำนวยความสะดวกในการใช้งานธุรกิจและในทางกลับกันมันคือการทำให้การเขียนโปรแกรมเซิร์ฟเวอร์ง่ายขึ้นและปรับปรุงประสิทธิภาพการเข้าถึง คุกกี้เป็นเทคโนโลยีของลูกค้า (นั่นคือเบราว์เซอร์) หลังจากตั้งค่าคุกกี้ทุกครั้งที่คุณเยี่ยมชมเซิร์ฟเวอร์คุกกี้จะถูกนำมาใช้ในคำขอ เซสชันเป็นเทคโนโลยีของเซิร์ฟเวอร์ซึ่งจัดเก็บข้อมูลการเข้าถึงผู้ใช้บนเซิร์ฟเวอร์
ใช้คุกกี้เพื่อส่งข้อมูล เมื่อจำนวนคุกกี้เพิ่มขึ้นและจำนวนการเข้าชมเพิ่มขึ้นแบนด์วิดท์ที่ใช้จะมากขึ้นและใหญ่ขึ้น เมื่อใช้เซสชันเพื่อบันทึกข้อมูลจุดอ่อนที่ใหญ่ที่สุดคือมันไม่ใช่เรื่องง่ายที่จะแบ่งปันระหว่างเซิร์ฟเวอร์หลายเครื่อง
1 คุกกี้
ในแง่ของ Layman เมื่อผู้ใช้เข้าถึงเซิร์ฟเวอร์โดยใช้ HTTP เซิร์ฟเวอร์จะส่งคืนข้อมูลคู่คีย์ค่าบางส่วนไปยังเบราว์เซอร์ไคลเอนต์และเพิ่มข้อ จำกัด บางอย่างให้กับข้อมูลเหล่านี้ เมื่อผู้ใช้มีคุณสมบัติตรงตามข้อ จำกัด ในครั้งต่อไปที่ผู้ใช้เข้าถึงเซิร์ฟเวอร์เขาจะนำชุดข้อมูลคู่คีย์คุกกี้มาก่อนหน้านี้ เมื่อผู้ใช้เข้าสู่ URL เบราว์เซอร์จะมองหาคุกกี้ที่เกี่ยวข้องกับ URL ในฮาร์ดไดรฟ์ท้องถิ่น หากคุกกี้มีอยู่เบราว์เซอร์จะส่งคุกกี้ไปยังเว็บไซต์ของคุณพร้อมกับคำขอหน้า
คุกกี้เกี่ยวข้องกับเว็บไซต์ไม่ใช่กับหน้าเฉพาะ ดังนั้นไม่ว่าหน้าใดในเว็บไซต์เบราว์เซอร์และเซิร์ฟเวอร์จะแลกเปลี่ยนข้อมูลคุกกี้ เมื่อผู้ใช้เยี่ยมชมเว็บไซต์ที่แตกต่างกันแต่ละไซต์อาจส่งคุกกี้ไปยังเบราว์เซอร์ของผู้ใช้ เบราว์เซอร์จะเก็บคุกกี้ทั้งหมดแยกกัน
รายการแอตทริบิวต์คุกกี้
ขณะนี้มีคุกกี้ 2 เวอร์ชันเวอร์ชัน 0 และเวอร์ชัน 1 มีตัวระบุส่วนหัวตอบกลับ 2 ประเภทคือ "Set-Cookie" และ "Set-Cookie2"
คุกกี้ 0 ค่าแอตทริบิวต์
ค่าแอตทริบิวต์คุกกี้ 1
ตัวอย่างการใช้คุกกี้ใน Java
@OverridePublic Void doget (httpservletRequest คำขอ httpservletResponse) พ่น IOException {response.setContentType ("ข้อความ/html; charset = utf-8"); printwriter out = response.getWriter () == null) {response.addcookie (คุกกี้ใหม่ ("ชื่อ", "luoxn28"));} else {system.out.println (ชื่อ);} out.println ("Hello World"); (cookie.getName (). เท่ากับ (คีย์)) {return cookie.getValue ();}}} return null;}ข้อควรระวังบางประการสำหรับการใช้คุกกี้ (การใช้ Java เป็นตัวอย่าง)
•ชื่อและค่าของคุกกี้ที่สร้างขึ้นไม่สามารถเป็นอักขระที่ไม่ใช่เครื่องดื่มได้ หากเป็นภาษาจีนก็สามารถเข้ารหัสผ่าน rrlencoder มิฉะนั้นจะมีการโยน java.lang.illegalargumentException
•เมื่อมีหลายชื่อและค่าค่าปรากฏขึ้นจริง ๆ แล้วจะอยู่ในส่วนหัว "คุกกี้" เดียวกัน
•มูลค่าของคุกกี้สามารถบันทึกเครื่องหมายวรรคตอนอื่นนอกเหนือจาก ";" แต่ตัวละครจีนไม่สามารถบันทึกได้ ขยะจะปรากฏขึ้นเมื่อบันทึกตัวละครจีน
ข้อ จำกัด บางประการเกี่ยวกับคุกกี้
คุกกี้เป็นสนามในส่วนหัว HTTP HTTP เองไม่มีข้อ จำกัด ในสาขานี้ แต่ในที่สุดคุกกี้ก็ถูกเก็บไว้ในเบราว์เซอร์ เบราว์เซอร์ที่แตกต่างกันมีข้อ จำกัด บางประการเกี่ยวกับการจัดเก็บคุกกี้ดังแสดงในตารางต่อไปนี้:
หากคุณพยายามเก็บคุกกี้ให้มากขึ้นคุกกี้ที่เก่าแก่ที่สุดจะถูกทิ้ง
2 เซสชัน
เซสชันแก้ปัญหาที่เมื่อจำนวนคุกกี้เพิ่มขึ้นจำนวนการส่งข้อมูลระหว่างไคลเอนต์และเซิร์ฟเวอร์จะเพิ่มขึ้น เมื่อไคลเอนต์เดียวกันโต้ตอบกับเซิร์ฟเวอร์ไม่จำเป็นต้องส่งผ่านค่าคุกกี้ทั้งหมดทุกครั้ง แต่มีเพียงค่า ID เท่านั้นที่จะผ่าน ID นี้ถูกสร้างขึ้นเมื่อไคลเอนต์เข้าถึงเซิร์ฟเวอร์เป็นครั้งแรกและไคลเอนต์แต่ละตัวไม่ซ้ำกัน ID นี้มักจะเป็นคุกกี้ที่มีชื่อ jsessionid
เซสชันทำงานตามคุกกี้อย่างไร? มันสามารถขึ้นอยู่กับพารามิเตอร์เส้นทาง URL; นอกจากนี้ยังสามารถขึ้นอยู่กับคุกกี้ หากโลโก้คุกกี้ในคอนเทนเนอร์บริบทไม่ได้รับการแก้ไขก็จะได้รับการสนับสนุนโดยค่าเริ่มต้น เมื่อเบราว์เซอร์ไม่รองรับฟังก์ชั่นคุกกี้เบราว์เซอร์จะเขียน SessionCookiename ของผู้ใช้ใหม่ไปยังพารามิเตอร์ URL ที่ผู้ใช้ร้องขอ วิธีการส่งมอบของมันคือเช่น /path /servlet; name = xxx; name2 = xxx2? name3 = xxx3 SessionCookiename หากรายการการกำหนดค่า Session-Config ได้รับการกำหนดค่าใน web.xml แอตทริบิวต์ชื่อภายใต้คุกกี้-Config เป็นค่าของเซสชั่นนี้ หากไม่ได้กำหนดค่ารายการการกำหนดค่า Session-Config ให้เริ่มต้น SessionCookienameJiushi "JSessionId" โปรดทราบว่าคุกกี้ที่เกี่ยวข้องกับเซสชันไม่แตกต่างจากคุกกี้อื่น ๆ หากลูกค้ารองรับคุกกี้ Tomcat จะยังคงแยกวิเคราะห์รหัสเซสชันในคุกกี้และเขียนทับรหัสเซสชันใน URL
เซสชันทำงานอย่างไร
ด้วย ID เซสชันเซิร์ฟเวอร์สามารถสร้างวัตถุ HTTPSESSION ครั้งแรกที่คุณโทรหาวิธีการร้องขอ GetSession () หากไม่มีวัตถุ Httpsession ที่สอดคล้องกันวัตถุใหม่จะถูกสร้างและเพิ่มลงในคอนเทนเนอร์เซสชันของ org.apache.catalina.Manager จะถูกบันทึกไว้ จัดการบันทึกวัฏจักรชีวิตเซสชันทั้งหมดเซสชันจะหมดอายุและรีไซเคิลเซิร์ฟเวอร์ปิดและเซสชันจะถูกทำให้เป็นอนุกรมเป็นดิสก์ โปรดทราบว่าไคลเอนต์สอดคล้องกับวัตถุเซสชันซึ่งบันทึกค่าเซสชันที่เราสร้างขึ้น
มาตรฐานที่เรียกโดยวิธีการร้องขอ GetSession () จะมีอยู่เสมอแม้ว่าเซสชันที่เกี่ยวข้องกับลูกค้านี้หมดอายุ หากหมดอายุจะมีการสร้างใหม่ แต่ค่าเซสชันที่ตั้งไว้ก่อนหน้านี้จะหายไป
3 การเปรียบเทียบคุกกี้และความปลอดภัยของเซสชัน
คุกกี้ผ่านข้อมูลที่บันทึกไว้จากไคลเอนต์ไปยังเซิร์ฟเวอร์ผ่านส่วนหัว HTTP จากนั้นจากเซิร์ฟเวอร์ไปยังไคลเอนต์ ข้อมูลทั้งหมดจะถูกบันทึกไว้ในเบราว์เซอร์ไคลเอนต์ ข้อมูลเหล่านี้สามารถเข้าถึงได้และคุกกี้สามารถเพิ่มและแก้ไขผ่านปลั๊กอินได้ ความปลอดภัยของคุกกี้ทั้งหมดค่อนข้างแย่ ในการเปรียบเทียบเซสชันจะบันทึกข้อมูลทางฝั่งเซิร์ฟเวอร์ซึ่งปลอดภัยกว่ามาก ต้องใช้คุกกี้เท่านั้นที่จะส่งรหัสคุกกี้กลับดังนั้นเซสชันจึงเหมาะสำหรับการประหยัดความเป็นส่วนตัวของผู้ใช้และข้อมูลที่สำคัญ
เฟรมเวิร์กเซสชันกระจาย
ในแอพพลิเคชั่นอินเทอร์เน็ตขนาดใหญ่การใช้คุกกี้และเซสชันเพียงอย่างเดียวนั้นไม่สามารถทำได้เนื่องจากการใช้คุกกี้สามารถแก้ปัญหาการปรับใช้แบบกระจายของแอปพลิเคชันได้ดี ระบบแอปพลิเคชันอินเทอร์เน็ตขนาดใหญ่มีเครื่องจักรหลายร้อยเครื่องและระบบแอปพลิเคชันที่แตกต่างกันหลายอย่างทำงานร่วมกัน เนื่องจากคุกกี้เก็บข้อมูลในเบราว์เซอร์ของผู้ใช้ทุกครั้งที่ผู้ใช้เข้าชมข้อมูลจะถูกนำกลับไปยังเซิร์ฟเวอร์ซึ่งแก้ปัญหาความไม่สอดคล้องกันของคุกกี้ที่เกิดจากคำขอของผู้ใช้เดียวกันที่ถูกประมวลผลบนเซิร์ฟเวอร์ที่แตกต่างกัน
เนื่องจากแอปพลิเคชันเป็นคลัสเตอร์เซสชันจึงไม่สามารถบันทึกไว้ในหน่วยความจำของแต่ละเซิร์ฟเวอร์ หากเซิร์ฟเวอร์แต่ละเซิร์ฟเวอร์มีผู้ใช้การเข้าถึงหลายแสนคนหน่วยความจำเซิร์ฟเวอร์จะไม่สามารถรองรับได้ แม้ว่าจะสามารถรองรับได้ แต่ก็ไม่สามารถรับประกันได้ว่าเซสชันจะถูกซิงโครไนซ์กับเซิร์ฟเวอร์อื่น ๆ ดังนั้นการแบ่งปันเซสชันเหล่านี้จำเป็นต้องมีการบันทึกไว้ในแคชแบบกระจายพิเศษซึ่งสามารถอ่านและเขียนได้ตลอดเวลา ประสิทธิภาพจะต้องดีพอที่จะตอบสนองความต้องการเช่น Memcache/Redis หรือ Taobao Open Source Distributed Framework Tair
คำถามการส่งแบบฟอร์มซ้ำ ๆ
มีหลายสถานที่ในเว็บไซต์ที่มีการส่งซ้ำ เพื่อป้องกันการส่งแบบฟอร์มซ้ำ ๆ จำเป็นต้องระบุคำขอการเข้าถึงแต่ละครั้งของผู้ใช้เพื่อให้คำขอการเข้าถึงแต่ละครั้งไม่ซ้ำกับเซิร์ฟเวอร์ ในการระบุคำขอแต่ละรายการของผู้ใช้สามารถเพิ่มรายการแบบฟอร์มที่ซ่อนอยู่ในฟิลด์ฟอร์มที่ผู้ใช้ร้องขอและค่าของมันเป็นโทเค็นที่ไม่ซ้ำกันเช่น:
<form id = "form" method = "post"> ... <input type = hidden name = "token" value = "xxx"/> </form>
โทเค็นที่ไม่ซ้ำกันจะถูกสร้างขึ้นเมื่อผู้ใช้ร้องขอแบบฟอร์มและตั้งค่าเป็นเซสชันของผู้ใช้ เมื่อผู้ใช้ส่งจะตรวจสอบว่าโทเค็นสอดคล้องกับโทเค็นที่บันทึกไว้ในเซสชันหรือไม่ หากสอดคล้องกันก็หมายความว่าไม่มีการส่งซ้ำ ในเวลาเดียวกันโทเค็นในเซสชันจะได้รับการปรับปรุงเป็นค่าโทเค็นใหม่ มิฉะนั้นโทเค็นที่ส่งโดยผู้ใช้จะไม่เป็นโทเค็นทางกฎหมายของคำขอปัจจุบันอีกต่อไปและการส่งล้มเหลว
ข้างต้นเป็นสิ่งที่เกี่ยวกับคุกกี้และเซสชันใน Java ที่บรรณาธิการแนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!