การจัดการเซสชันใน ASP.NET [ตัวอย่าง]

⚡ สรุปอย่างชาญฉลาด

การจัดการเซสชันใน ASP.NET ช่วยให้แอปพลิเคชัน HTTP ที่ไม่มีสถานะสามารถจดจำข้อมูลผู้ใช้ได้ระหว่างการร้องขอต่างๆ บทความนี้จะอธิบายเกี่ยวกับ ViewState, อ็อบเจ็กต์ Session สำหรับจัดเก็บคู่คีย์-ค่า, ตัวอย่างการใช้งาน, โหมดสถานะเซสชัน, การกำหนดค่าหมดเวลา และข้อดีของสถานะเซสชัน

  • 🌐 HTTP แบบไร้สถานะ: HTTP ไม่เก็บรักษาข้อมูลระหว่างการร้องขอ ดังนั้น ASP.NET จึงเพิ่มกลไกเพื่อรักษาข้อมูลสถานะไว้
  • 🗂️ สถานะการแสดงผล: ViewState จะส่งค่าการควบคุมจากหน้าหนึ่งไปยังอีกหน้าหนึ่งโดยอัตโนมัติ
  • 🔑 อ็อบเจ็กต์เซสชัน: Session[“Key”] จัดเก็บและเรียกใช้คู่คีย์-ค่าตลอดวงจรชีวิตของแอปพลิเคชัน
  • ⚙️ โหมดสถานะ: สถานะเซสชันสามารถจัดเก็บได้ในกระบวนการทำงาน (InProc), บน StateServer, ใน SQL Server หรือในที่เก็บข้อมูลแบบกำหนดเอง
  • ⏱️ หมดเวลา: ค่า sessionState timeout ในไฟล์ web.config จะควบคุมระยะเวลาที่เซสชันจะยังคงใช้งานได้

บทช่วยสอนการจัดการเซสชันใน ASP.NET พร้อมตัวอย่าง

การจัดการเซสชัน ASP.NET

โปรโตคอล HTTP ที่เว็บแอปพลิเคชันทั้งหมดทำงานนั้นเป็นโปรโตคอลไร้สัญชาติ การไร้สัญชาติหมายความว่าข้อมูลจะไม่ถูกเก็บรักษาไว้จากคำขอหนึ่งไปยังอีกคำขอหนึ่ง

ตัวอย่างเช่น หากคุณมีหน้าเข้าสู่ระบบที่มีช่องข้อความ 2 ช่อง ช่องหนึ่งสำหรับชื่อและอีกช่องสำหรับรหัสผ่าน เมื่อคุณคลิกปุ่มเข้าสู่ระบบบนหน้าดังกล่าว แอปพลิเคชันจะต้องตรวจสอบให้แน่ใจว่าชื่อผู้ใช้และรหัสผ่านถูกส่งต่อไปยังหน้าถัดไป

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

ไม่เหมาะสำหรับนักพัฒนาที่จะเปลี่ยนแปลงสิ่งใดในสถานะมุมมอง เนื่องจากควรได้รับการจัดการโดย ASP.Net เท่านั้น

วัตถุเซสชัน ASP.NET

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

Session["Key"] = value

วิธีการนี้จะเก็บค่าไว้ในอ็อบเจ็กต์ Session โดยส่วน 'key' จะใช้สำหรับตั้งชื่อให้กับค่า ทำให้สามารถเรียกใช้ค่าได้ในภายหลัง หากต้องการเรียกใช้ค่า คุณสามารถใช้คำสั่งด้านล่างนี้ได้เลย

Session["Key"]

ตัวอย่างอ็อบเจ็กต์เซสชัน ASP.NET

ในตัวอย่างนี้ เราจะใช้ object Session เพื่อเก็บชื่อที่ป้อนในช่องข้อความชื่อบนหน้าเว็บ จากนั้นเราจะดึงค่าดังกล่าวออกมาและแสดงผลบนหน้าเว็บตามต้องการ มาเพิ่มโค้ดด้านล่างลงในไฟล์ Demo.aspx.cs กันเลย

ใช้วัตถุเซสชัน

protected void btnSubmit_Click(object sender, EventArgs e)
{
	Session["Name"] = txtName.Text;

	Response.Write(Session["Name"]);

	lblName.Visible = false;
	txtName.Visible = false;
	lstLocation.Visible = false;
	chkC.Visible = false;
	chkASP.Visible = false;
	rdMale.Visible = false;
	rdFemale.Visible = false;
	btnSubmit.Visible = false;
}

Code คำอธิบาย:-

  1. บรรทัดแรกของโค้ดจะดึงค่าจากช่องข้อความ "Name" และเก็บไว้ในอ็อบเจ็กต์ Session โดยการระบุโค้ด Session[“Name”] เราจะตั้งชื่อให้กับคุณสมบัตินี้ว่า “Name” การกำหนดชื่อให้กับคุณสมบัตินี้จะทำให้เรียกใช้ค่าได้ง่ายขึ้นในภายหลัง
  2. บรรทัดถัดไปของโค้ดดึงค่าที่เก็บไว้จากวัตถุเซสชัน จากนั้นจะเขียนค่านี้ผ่านวิธี 'Response.Write' กลับไปยังไคลเอ็นต์
  3. สุดท้ายนี้ เราจะทำให้ปุ่มควบคุมทั้งหมดในแบบฟอร์มมองไม่เห็น หากเราไม่ทำเช่นนี้ ปุ่มควบคุมทั้งหมดรวมถึงค่าการตอบกลับจะแสดงพร้อมกัน

เมื่อคุณทำการเปลี่ยนแปลงข้างต้นเสร็จแล้ว คุณจะเห็นผลลัพธ์ดังต่อไปนี้

Output:

ใช้วัตถุเซสชัน

จากผลลัพธ์ คุณจะเห็นว่าค่าเซสชันของชื่อถูกดึงและแสดงในเบราว์เซอร์

โหมดสถานะเซสชันของ ASP.NET

ASP.NET สามารถจัดเก็บข้อมูลเซสชันได้หลายที่ ซึ่งเรียกว่าโหมดสถานะเซสชัน โหมดที่คุณเลือกจะมีผลต่อประสิทธิภาพ ความสามารถในการขยายขนาด และว่าข้อมูลจะยังคงอยู่หรือไม่หลังจากรีสตาร์ทแอปพลิเคชัน ตารางด้านล่างนี้เปรียบเทียบโหมดต่างๆ:

โหมด ตำแหน่งที่เก็บสถานะ เหมาะสำหรับ
อินโปรค ในหน่วยความจำของเว็บเซิร์ฟเวอร์ (ค่าเริ่มต้น) แอปพลิเคชันแบบเซิร์ฟเวอร์เดี่ยว เร็วที่สุด แต่จะสูญเสียข้อมูลเมื่อรีสตาร์ท
สเตทเซิร์ฟเวอร์ กระบวนการบริการสถานะ ASP.NET แยกต่างหาก เว็บฟาร์ม; สามารถทนต่อการรีสตาร์ทแอปพลิเคชันได้
SQLเซิร์ฟเวอร์ ฐานข้อมูล SQL Server เว็บฟาร์มที่ต้องการสถานะที่ทนทานและปรับขนาดได้
แผ่นกระดาษ ผู้ให้บริการแบบกำหนดเองที่คุณใช้งาน ร้านค้าเฉพาะทาง เช่น Redis
Off สถานะเซสชันถูกปิดใช้งาน แอปพลิเคชันที่ไม่ต้องใช้เซสชัน

InProc เป็นค่าเริ่มต้นและเร็วที่สุด แต่สำหรับการใช้งานแบบโหลดบาลานซ์ StateServer หรือ SQLServer จะช่วยให้เซสชันพร้อมใช้งานบนเซิร์ฟเวอร์หลายเครื่อง

วิธีการตั้งค่าการหมดเวลาของเซสชันใน ASP.NET

เซสชันไม่ได้คงอยู่ตลอดไป มันจะหมดอายุหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง คุณสามารถตั้งค่าการหมดอายุนี้ได้ในไฟล์ web.config โดยใช้ element sessionState โดยค่าการหมดอายุจะมีหน่วยเป็นนาที:

<configuration>
  <system.web>
    <sessionState mode="InProc" timeout="20" />
  </system.web>
</configuration>

คุณสามารถตั้งค่าในโค้ดได้เช่นกันด้วย Session.Timeout = 30;ค่าเริ่มต้นของการหมดเวลาคือ 20 นาที การเลือกเวลาหมดเวลาที่สั้นกว่าจะช่วยเพิ่มพื้นที่ว่างในหน่วยความจำของเซิร์ฟเวอร์ได้เร็วขึ้นและเพิ่มความปลอดภัย ในขณะที่การเลือกเวลาหมดเวลาที่ยาวกว่าจะทำให้ผู้ใช้ล็อกอินค้างไว้ได้นานขึ้น

ข้อดีและข้อเสียของการประชุมสภา

สถานะเซสชันนั้นสะดวก แต่ก็มีข้อดีข้อเสียที่คุณควรพิจารณาก่อนที่จะพึ่งพามันมากเกินไป

ข้อดี:

  • ใช้งานง่ายสำหรับการจัดเก็บข้อมูลส่วนบุคคลของผู้ใช้ เช่น ข้อมูลร้านค้าping รายละเอียดตะกร้าสินค้าหรือรายละเอียดการเข้าสู่ระบบ
  • สามารถจัดเก็บวัตถุที่ซับซ้อนได้ ไม่ใช่แค่สตริงเท่านั้น
  • ข้อมูลถูกจัดเก็บไว้บนเซิร์ฟเวอร์ ดังนั้นจึงมีความปลอดภัยมากกว่าการจัดเก็บไว้ที่ฝั่งไคลเอ็นต์

ข้อเสีย:

  • โหมด InProc ใช้หน่วยความจำของเซิร์ฟเวอร์มาก และไม่สามารถปรับขนาดได้ทั่วทั้งเว็บฟาร์ม
  • ข้อมูลในเซสชันจะสูญหายเมื่อเซสชันหมดเวลาหรือแอปพลิเคชันเริ่มต้นใหม่ (ในโหมด InProc)
  • การจัดเก็บข้อมูลจำนวนมากต่อผู้ใช้หนึ่งรายอาจส่งผลเสียต่อประสิทธิภาพการทำงานเมื่อมีการใช้งานหนัก

คำถามที่พบบ่อย

ใช่แล้ว ผู้ช่วย AI สามารถสร้างโค้ดเพื่อจัดเก็บและอ่านค่า Session แนะนำโหมดสถานะที่เหมาะสม และเขียนการตั้งค่า web.config ได้ Revตรวจสอบโค้ดที่สร้างขึ้นเพื่อยืนยันว่าตรงกับความต้องการด้านความสามารถในการขยายขนาดและความปลอดภัยของคุณ

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

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

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

สรุปโพสต์นี้ด้วย: