ก่อนอื่น .asa คือส่วนต่อท้ายไฟล์ ซึ่งเป็นตัวย่อของ Active Server Application ไฟล์ Global.asa สามารถจัดการอ็อบเจ็กต์ที่มีความต้องการสูงสองตัวในแอปพลิเคชัน ASP: แอปพลิเคชันและเซสชัน
จริงๆ แล้วมันเป็นไฟล์ทางเลือกที่ผู้เขียนโปรแกรมสามารถระบุสคริปต์เหตุการณ์และประกาศอ็อบเจ็กต์ด้วยขอบเขตเซสชันและแอปพลิเคชัน เนื้อหาของไฟล์นี้ไม่ได้ใช้เพื่อแสดงต่อผู้ใช้ แต่ใช้เพื่อเก็บข้อมูลเหตุการณ์และวัตถุที่แอปพลิเคชันใช้ทั่วโลก ไฟล์นี้จะต้องอยู่ในไดเร็กทอรีรากของแอปพลิเคชัน สามารถมีไฟล์ Global.asa ได้เพียงหนึ่งไฟล์ต่อแอปพลิเคชันเท่านั้น
ความเข้าใจผิดที่พบบ่อยที่สุดเกี่ยวกับไฟล์ Global.asa คือสามารถใช้เป็นไลบรารีสำหรับฟังก์ชันและรูทีนย่อยที่ใช้โดยทั่วไปได้ ไฟล์ Global.asa สามารถใช้เพื่อสร้างการอ้างอิงออบเจ็กต์และการเริ่มต้นการจับ และสิ้นสุดออบเจ็กต์แอปพลิเคชันและออบเจ็กต์เซสชันเท่านั้น
ไฟล์ Global.asa มีการเข้าถึงตามเหตุการณ์ระดับเซสชันเป็นหลัก และถูกเรียกในสามสถานการณ์ต่อไปนี้:
1. เมื่อเหตุการณ์ Application_OnStart หรือ Application_OnEnd ถูกทริกเกอร์
2. เมื่อเหตุการณ์ Session_OnStart หรือ Session_OnEnd ถูกทริกเกอร์
3. เมื่ออ้างอิงวัตถุ (Object) ที่สร้างอินสแตนซ์ในไฟล์ Global.asa
รูปแบบไฟล์มาตรฐานของ Global.asa เป็นดังนี้:
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
Application_OnStart ย่อย
'Application_OnStart ทำงานเมื่อลูกค้ารายใดเข้าชมหน้าแรกของแอปพลิเคชันเป็นครั้งแรก
จบหมวดย่อย
SubSession_OnStart
'Session_OnStart ทำงานเมื่อไคลเอ็นต์เรียกใช้เพจใดๆ ในแอปพลิเคชัน ASP เป็นครั้งแรก
จบหมวดย่อย
เซสชันย่อย_เมื่อสิ้นสุด
'Session_OnEnd ทำงานเมื่อเซสชันของลูกค้าหมดเวลาหรือออกจากแอปพลิเคชัน
จบหมวดย่อย
SubApplication_OnEnd
'Application_OnEnd ทำงานเมื่อเว็บเซิร์ฟเวอร์ของไซต์ปิดตัวลง
จบหมวดย่อย
</สคริปต์>
1. Session_onStart
ก่อนอื่น มาดูโค้ดที่ควบคุมผู้ใช้ในการเข้าสู่เพจกันก่อน:
1. Global.asa (อยู่ใต้ไดเร็กทอรีรากของไดเร็กทอรีเสมือนที่กำลังดีบั๊ก)
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
Sub Session_OnStart 'ตราบใดที่ผู้ใช้ล็อกอินเข้าสู่ไซต์นี้เป็นครั้งแรก เขาจะข้ามไปที่หน้าแรก
การตอบสนองการเปลี่ยนเส้นทาง(http://www.vevb.com)
จบหมวดย่อย
</สคริปต์>
จากนั้นดีบักไฟล์ใดๆ ในไดเร็กทอรีเสมือนปัจจุบัน คุณจะพบว่าทุกหน้าข้ามไปที่ http://www.vevb.com/<
จากตัวอย่างการบังคับให้เข้าสู่หน้าใดหน้าหนึ่ง คุณสามารถจินตนาการได้ว่าจำเป็นมากเมื่อหน้าแรกต้องการความสนใจ
เรามาสังเกตเหตุการณ์ Session_OnStart และ Session_OnEnd กันต่อโดยใช้ตัวอย่างจำนวนคนที่ออนไลน์
2. เซสชัน_เมื่อสิ้นสุด
2. Global.asa (อยู่ใต้ไดเร็กทอรีรากของไดเร็กทอรีเสมือนที่กำลังดีบั๊ก)
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
Sub Application_onStart 'ค่าเริ่มต้นคือ 0
ใบสมัคร(ออนไลน์) = 0
จบหมวดย่อย
Sub Session_onStart 'การเข้าชมของผู้ใช้และจำนวนเพิ่มขึ้น 1
แอปพลิเคชั่นล็อค
แอปพลิเคชัน (ออนไลน์) = แอปพลิเคชัน (ออนไลน์) + 1
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
Sub Session_OnEnd 'เมื่อสิ้นสุดกระบวนการของผู้ใช้ จำนวนจะลดลง 1 (PS หากไม่มีโปรแกรมเหตุการณ์ดังกล่าว โปรแกรมเข้าถึงเพจจะถูกดำเนินการ)
แอปพลิเคชั่นล็อค
แอปพลิเคชัน (ออนไลน์) = แอปพลิเคชัน (ออนไลน์) - 1
แอปพลิเคชั่นปลดล็อค
จบหมวดย่อย
</สคริปต์>
3.ออนไลน์.asp
-
ถ้า request.querystring(logout)=true แล้ว
เซสชั่นละทิ้ง()
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
-
ขณะนี้มี <%=Application(OnLine)%> ออนไลน์อยู่
<a href=online.asp?logout=true>ออก</a>
คุณพบว่ามีเพียงแอปพลิเคชันเดียว (ออนไลน์) ในหน้านี้ และยังคงมีการอ้างอิงอย่างชัดเจน แล้วคุณค่าของมันมาจากไหน? นี่คือกุญแจสำคัญในไฟล์ Global.asa คุณสามารถเปิดหน้าต่างตามลำดับบนเครื่องนี้ และดำเนินการแก้ไขจุดบกพร่องได้สองวิธี: ปิดหน้าต่างหรือออก
3. ปรับแต่งต่อไป
ในโปรแกรมข้างต้นคุณจะพบว่าผลของการปิดหน้าต่างหลังจากออกจากการเชื่อมต่อจะแตกต่างจากการปิดหน้าต่างโดยตรง เนื่องจากเซสชันมีอยู่เป็นเวลานาน เหตุการณ์ Session_OnEnd จึงไม่สามารถทริกเกอร์ได้เมื่อปิดหน้าต่างโดยตรง แล้วจะตระหนักถึงแนวคิดที่แทบจะเป็นไปไม่ได้นี้ได้อย่างไร
ดังที่เราทุกคนทราบกันดีว่า เมื่อหน้าเว็บถูกปิด หน้าเว็บนั้นก็สามารถเชื่อมโยงกับเหตุการณ์ onunload ได้ ตราบใดที่ onunload สามารถทำหน้าที่ออกจากระบบของเซสชันได้ นั่นไม่ใช่สิ่งที่เราต้องการใช่หรือไม่ เพื่อเป็นการไม่ให้เสียเวลา มาแก้ไข online.asp กันดีกว่า
3.ออนไลน์.asp
-
ถ้า request.querystring(logout)=true แล้ว
เซสชั่นละทิ้ง()
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
-
<body onunload=javascript:window.open(exit.asp)>
ขณะนี้มี <%=Application(OnLine)%> ออนไลน์อยู่
<a href=online.asp?logout=true>ออก</a>
โปรดทราบว่าเมื่อ online.asp ดำเนินการ onunload exit.asp จะถูกเปิดขึ้น จากนั้นเพียงตั้งค่า session.Abandon() ใน exit.asp แล้วทุกอย่างจะเรียบร้อย
4.ทางออก.asp
<%เซสชัน.ละทิ้ง()%>
<สคริปต์>
ตนเอง.ปิด()
</สคริปต์>
แน่นอนว่ามีการเพิ่มสคริปต์เพื่อปิดเซสชันทันทีหลังจากออกจากระบบ โดยพื้นฐานแล้วเว็บแอปพลิเคชันสำหรับสถิติออนไลน์ก็เพียงพอแล้ว
4. การศึกษาเชิงลึกของ Global.asa
จากการดีบักข้างต้น หากคุณอนุมานจากตัวอย่างหนึ่ง คุณจะถามคำถามอย่างแน่นอน: จะควบคุมจำนวนผู้ใช้ที่ลงทะเบียนออนไลน์ได้อย่างไร จากนั้นดูไฟล์ต่อไปนี้ทีละไฟล์:
5. Global.asa (อยู่ใต้ไดเร็กทอรีรากของไดเร็กทอรีเสมือนที่กำลังดีบั๊ก)
<ภาษาสคริปต์=VBScript RUNAT=เซิร์ฟเวอร์>
Application_OnStart ย่อย
ใบสมัคร(ออนไลน์)=0
จบหมวดย่อย
SubSession_OnStart
จบหมวดย่อย
เซสชันย่อย_เมื่อสิ้นสุด
ถ้า session.contents (ผ่าน) จากนั้น 'ตรวจสอบว่าเป็น Session_OnEnd ของผู้ใช้ที่เข้าสู่ระบบหรือไม่
แอปพลิเคชันล็อค
แอปพลิเคชัน (ออนไลน์) = แอปพลิเคชัน (ออนไลน์) -1
แอปพลิเคชันปลดล็อค
สิ้นสุดถ้า
จบหมวดย่อย
SubApplication_OnEnd
จบหมวดย่อย
</สคริปต์>
โปรดทราบว่าบล็อก Session_OnStart ใน Global.asa นี้ไม่ได้ทำกิจกรรมใดๆ
เพราะเมื่อผู้ใช้เข้าถึงเซิร์ฟเวอร์ ไม่ว่าผู้ใช้จะเข้าสู่ระบบหรือไม่ก็ตาม เหตุการณ์ OnStart จะถูกสร้างขึ้น และสิ่งที่จำเป็นตอนนี้คือผู้ใช้ที่เข้าสู่ระบบออนไลน์อยู่ ดังนั้น Application (ออนไลน์) จึงไม่สามารถเพิ่มได้ 1 นิ้ว เหตุการณ์ OnStart
และเนื่องจากเหตุการณ์ OnEnd จะถูกสร้างขึ้นไม่ว่าเซสชันของผู้ใช้ที่เข้าสู่ระบบจะสิ้นสุดลงหรือไม่ (หากผู้เยี่ยมชมเยี่ยมชมเซิร์ฟเวอร์แต่ไม่ได้เข้าสู่ระบบ กิจกรรม OnEnd จะถูกสร้างขึ้นหลังจากเซสชันของเขาสิ้นสุดลงด้วย) ดังนั้นคำสั่ง if ใช้ในเหตุการณ์ Session_OnEnd เพื่อตัดสินว่าเป็นเหตุการณ์ OnEnd ของผู้ใช้ที่เข้าสู่ระบบหรือไม่ หากเป็นเช่นนั้น จำนวนคนที่ออนไลน์จะลดลง 1 คน
และเป็นที่น่าสังเกต: การใช้ session.contents(pass) เนื่องจากห้ามใช้วัตถุ Session ในเหตุการณ์ OnEnd แต่สามารถเรียกตัวแปรเซสชันได้โดยใช้คอลเลกชันของวัตถุเซสชัน กล่าวอีกนัยหนึ่ง ไม่สามารถเขียน session(pass) ได้โดยตรง แต่จำเป็นต้องเขียน session.contents(pass)
6. เข้าสู่ระบบ.asp
-
ถ้า request.querystring(logout)=true แล้ว
เซสชั่นละทิ้ง()
สิ้นสุดถ้า
sendname=request.form(ส่ง)
ถ้า sendname=submit แล้ว
ชื่อ=request.form(ชื่อ)
pwd=request.form(pwd)
ถ้า name=cnbruce และ pwd=cnrose แล้ว
เซสชั่น(ชื่อ)=ชื่อ
เซสชั่น(ผ่าน)=จริง
อื่น
response.write ชื่อข้อผิดพลาดหรือ Pwd.<a href='login.asp'>ย้อนกลับ</a>
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
แอปพลิเคชันล็อค
แอปพลิเคชัน (ออนไลน์)=แอปพลิเคชัน (ออนไลน์)+1
แอปพลิเคชันปลดล็อค
-
ขณะนี้มีสมาชิกที่ลงทะเบียนแล้ว <%=application(online)%>
<a href=login.asp?logout=true>ออก</a>
<%อื่น%>
<การกระทำของฟอร์ม=login.asp method=post>
<ประเภทอินพุต=ชื่อข้อความ=ชื่อ><br>
<ประเภทอินพุต=ชื่อรหัสผ่าน=pwd><br>
<ประเภทอินพุต=ชื่อส่ง=ค่าส่ง=ส่ง>
<%สิ้นสุดถ้า%>
เพียงตรวจพบว่าเมื่อชื่อผู้ใช้คือ cnbruce และรหัสผ่านคือ cnrose จะมีการสร้าง session(pass)=true ซึ่งตัดสินใน Global.asa
ห้า ใช้จินตนาการของคุณต่อไป
การนับจำนวนคนที่ออนไลน์นั้นไม่เพียงพอ แต่ยังต้องระบุสถานะการออนไลน์ของผู้ใช้ด้วย
ดังที่คุณสามารถจินตนาการได้ วิธีการพื้นฐานคือเมื่อผู้ใช้เข้าสู่ระบบ ให้ตั้งค่าออนไลน์เป็น 1 ใน login.asp (อัปโหลดหากมีฐานข้อมูล) แต่เมื่อผู้ใช้ออฟไลน์ ให้ตั้งค่าออนไลน์เป็น 0 เพื่อปรับปรุงให้ดีขึ้น คุณ จำเป็นต้องแก้ไขเหตุการณ์ Session_OnEnd ตั้งค่าออนไลน์เป็น 0 ในเหตุการณ์นี้ (ค่า 0 จะถูกอัปโหลดด้วย)...