ค่าของคุกกี้มีความซับซ้อนมากกว่าค่าของคอลเลกชัน ASP อื่นๆ เช่น Form และ ServerVariables คุกกี้คือข้อความชิ้นเล็กๆ ที่เบราว์เซอร์จัดเก็บไว้ในระบบไคลเอ็นต์ และส่งพร้อมกับคำขอแต่ละรายการไปยังเซิร์ฟเวอร์ในโดเมนที่ใช้คุกกี้
ASP ช่วยให้ใช้คุกกี้ได้ง่ายขึ้น คุณสามารถรับค่าคุกกี้ทั้งหมดที่ส่งมาพร้อมกับคำขอจากคอลเลกชันคุกกี้ของวัตถุคำขอ และคุณสามารถสร้างหรือแก้ไขคุกกี้และส่งกลับไปยังผู้ใช้ผ่านคอลเลกชันคุกกี้ของการตอบกลับ วัตถุ.
คุกกี้ประกอบด้วยข้อมูลที่สามารถสร้างได้สองวิธี คุกกี้ค่าเดียวจะให้ค่าในการเขียนโค้ดผ่านคอลเลกชันที่คล้ายกับ ASP ทั่วไป อย่างไรก็ตาม สมาชิกแต่ละคนของคอลเลกชันอาจเป็นคอลเลกชัน และคุกกี้ที่มีข้อมูลนี้เรียกว่าคุกกี้แบบหลายค่า
การสร้างคุกกี้ค่าเดียวนั้นค่อนข้างง่าย ดังนี้:
Response.Cookies("item-name") = "item-value"
หากต้องการสร้างคุกกี้แบบหลายค่า คุณสามารถใช้คำสั่งต่อไปนี้:
Response.Cookies("item -name" )("sub-item-name") = "sub-item-value"
ตั้งค่าโดเมนและเส้นทางของแอปพลิเคชันคุกกี้และระยะเวลาที่มีผล เราใช้:
Response.Cookies("item-name").domain = "โดเมน-URL"
Response.Cookies (“ชื่อรายการ”).path = “เส้นทางเสมือน”
Response.Cookies("item-name").expires = #date#
โดยปกติแล้ว ไคลเอ็นต์จะส่งคุกกี้ไปยังเซิร์ฟเวอร์พร้อมกับคำขอเท่านั้น เมื่อทำการร้องขอเพจในไดเร็กทอรีที่สร้างคุกกี้ ด้วยการระบุแอตทริบิวต์เส้นทาง คุณสามารถระบุได้ว่าคุกกี้นี้ถูกต้องที่ใดในไซต์ และคุกกี้จะถูกส่งไปพร้อมกับคำขอ หากคุกกี้ถูกส่งพร้อมกับคำขอเพจสำหรับทั้งไซต์ ให้กำหนดเส้นทางเป็น "/"
หากไม่ได้ตั้งค่าแอตทริบิวต์ Expires คุกกี้จะถูกกำจัดโดยอัตโนมัติเมื่อปิดอินสแตนซ์เบราว์เซอร์ปัจจุบัน
โปรดทราบว่าคุกกี้จะถูกสร้างขึ้นแล้วเมื่อเราส่งข้อมูลใดๆ ไปยังเบราว์เซอร์ เนื่องจากคุกกี้เหล่านี้เป็นส่วนหนึ่งของส่วนหัว HTTP ของหน้า
ใน ASP 3.0 สถานะเริ่มต้นของการบัฟเฟอร์เปิดอยู่ และไม่มีเอาต์พุตใดถูกส่งออกไป เว้นแต่จะใช้ Response.Flush เพื่อระบุสิ่งนี้ หรือเพจถึงจุดสิ้นสุดแล้ว ซึ่งหมายความว่าโค้ดที่สร้างคุกกี้สามารถอยู่ที่ใดก็ได้บนเพจ และสามารถดำเนินการได้จนกว่าเอาต์พุตใดๆ จะถูก "ล้าง" ไปยังไคลเอนต์
หากต้องการอ่านคุกกี้ที่มีอยู่ ให้ใช้คอลเลกชัน Request.Cookies รายการภายในสามารถเข้าถึงได้ทีละรายการ คล้ายกับวิธีการที่ใช้สร้างรายการเหล่านั้น
StrSingleValue = Request.Cookies("ชื่อรายการ")
StrSubItemValue = Request.Cookies("item-name")("sub-item-name")
โปรดทราบว่าคอลเลกชัน Request.Cookies (เช่นเดียวกับคอลเลกชันคำขออื่นๆ ทั้งหมด) เป็นแบบอ่านอย่างเดียว คอลเลกชัน Response.Cookies เป็นแบบเขียนเท่านั้น ที่จริงแล้ว คุณสามารถเข้าถึงชื่อของชุดคุกกี้ในคอลเลกชันนี้ได้ แต่ไม่ใช่ค่าของมัน
การสำรวจคอลเลกชันคุกกี้
เพื่อที่จะใช้คอลเลกชันคุกกี้ได้สะดวกยิ่งขึ้น คุณสามารถใช้คุณลักษณะเพิ่มเติมชื่อ Haskeys หากคุกกี้ที่เข้าถึงนั้นเป็นคอลเลกชัน กล่าวคือ เป็นคุกกี้ที่มีหลายค่า คุกกี้นี้จะคืนค่าเป็น True เมื่อใช้คุณสมบัติ Haskeys คุณสามารถวนซ้ำคอลเลกชัน Request.Cookies ที่สมบูรณ์เพื่อรับรายการคุกกี้ทั้งหมดและค่าต่างๆ
สำหรับแต่ละรายการ objItem ในคำขอคุกกี้
ถ้า Request.Cookies(objItem).HasKey แล้ว
'ใช้อันอื่น For Each เพื่อวนซ้ำคีย์ย่อยทั้งหมด
สำหรับแต่ละ objItemKey ใน Request.Cookies(objItem)
การตอบสนองเขียน objItem & “(“ & objItemKey & “) = “_
& คำขอคุกกี้ (objItem) (objItemKey) & “<BR>”
ต่อไป
อื่น
'พิมพ์สตริงคุกกี้ตามปกติ
การตอบสนองเขียน objItem & “ = ” & คำขอคุกกี้ (objItem) & “<BR>”
สิ้นสุดถ้า
ถัดไปสิ่งนี้
คล้ายกับโค้ดที่ซับซ้อนก่อนหน้านี้มากซึ่งแยกค่าหลายค่าจากคอลเลกชัน Request.Form แต่คุณสามารถใช้แอตทริบิวต์ Haskeys ที่นี่เพื่อพิจารณาว่าแต่ละรายการเป็นชุดหรือไม่ ในตัวอย่างแบบฟอร์ม ต้องสืบค้นคุณสมบัติ Request.Form(item_name).Count เนื่องจากสมาชิกของคอลเลกชันแบบฟอร์ม (และคอลเลกชันอื่นๆ ทั้งหมดยกเว้นคุกกี้) ไม่สามารถเป็นคอลเลกชันจริงได้ ASP ทำงาน "เบื้องหลัง" และรับคุณค่าของคอลเลกชันหลายรายการแต่ละรายการ
ความแตกต่างระหว่าง Form และ QueryString
หลังจากทำความเข้าใจเทคนิคในการเข้าถึงคอลเลกชัน ASP ต่างๆ แล้ว คำถามอื่นที่ต้องได้รับการแก้ไข: อะไรคือความแตกต่างระหว่างคอลเลกชัน Form และ QueryString? หากคุณกำลังจะใช้ ASP คุณควรตระหนักถึงความแตกต่างนี้อย่างไม่ต้องสงสัย แต่คุณต้องอ้างอิงถึงวิธีการทำงานของ HTTP เพื่อทำความเข้าใจและทำความเข้าใจอีกครั้ง
มีสองวิธีทั่วไปในการขอเพจหรือทรัพยากรอื่นจากเว็บเซิร์ฟเวอร์ผ่าน HTTP คุณสามารถใช้วิธี GET เพื่อรับทรัพยากรโดยตรง หรือคุณสามารถใช้ POST เพื่อส่งค่าไปยังทรัพยากรที่เกี่ยวข้อง วิธีการ GET เป็นค่าเริ่มต้น คุณสามารถดูตัวอย่างคำขอ HTTP ก่อนหน้านี้ในบทนี้:
8/7/99 10:27:16 ส่ง GET /Store/Download.asp HTTP/1.1
หากคุณใส่อย่างน้อยหนึ่งคู่ ชื่อ เมื่อค่า / ถูกต่อท้าย URL ของเพจที่ร้องขอ มันจะกลายเป็นสตริงการสืบค้นที่ร้องขอ และถูกจัดเตรียมให้กับเพจ ASP ในคอลเลกชัน QueryString การคลิกไฮเปอร์ลิงก์บนเว็บเพจ ข้อความอีเมล หรือเอกสารอื่นๆ หรือป้อนที่อยู่ในแถบที่อยู่ของเบราว์เซอร์แล้วกด Enter หรือคลิกปุ่มลิงก์หรือรายการโปรดในเบราว์เซอร์ ทั้งหมดนี้ใช้วิธี GET
ดังนั้นวิธีเดียวที่จะส่งค่าไปยัง ASP ในการดำเนินการเหล่านี้คือผ่านคอลเลกชัน QueryString โดยผนวกค่าเข้ากับ URL
ค่าที่ปรากฏในคอลเลกชัน Request.QueryString และเข้าถึงได้ทำงานในลักษณะเดียวกับอินสแตนซ์การรวบรวมแบบฟอร์มที่เราเห็นก่อนหน้านี้ การรวมกันของ URL และสตริงการสืบค้น:
http://mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes
ค่าที่ระบุในคอลเลกชัน QueryString สามารถเข้าถึงได้ดังนี้:
strFirstName = Request.QueryString("FirstName") 'Return “พริสซิลลา”
strLastName = Request.QueryString("LastName") 'ส่งคืน "Descartes"
strRaw = คำขอ QueryString
'ส่งคืนวิธีการ "FirstName=Priscilla&LastName=Descartes"
ของแบบฟอร์ม
เมื่อใช้ส่วน <FORM> ในเพจ คุณสามารถตั้งค่าแอตทริบิวต์ METHOD ของแท็ก FORM ที่เปิดเป็น "GET" หรือ "POST" ค่าเริ่มต้นคือ "GET" หากใช้ "GET" หรือละเว้นแอตทริบิวต์ เบราว์เซอร์จะผูกค่านี้กับตัวควบคุมทั้งหมดบนเพจ กลายเป็นสตริงการสืบค้น และแนบไปกับ URL ของหน้าที่ร้องขอ
เมื่อคำขอนี้มาถึงเว็บเซิร์ฟเวอร์ ค่าของคำขอจะถูกจัดเตรียมโดยคอลเลกชัน Request.QueryString ของ ASP อย่างไรก็ตาม หากคุณตั้งค่าแอตทริบิวต์ METHOD เป็น "POST" เบราว์เซอร์จะตัดค่าลงในส่วนหัว HTTP ของเซิร์ฟเวอร์ที่ส่งและมอบให้กับ ASP ผ่านทางคอลเลกชัน Request.Form
อย่างไรก็ตาม วิธี POST สามารถใช้ในรูปแบบ HTML ทั้งหมดได้ อย่างไรก็ตาม มีข้อจำกัดบางประการเกี่ยวกับความยาวสตริง URL ของเบราว์เซอร์หรือเซิร์ฟเวอร์ ดังนั้น การต่อท้ายสายอักขระที่ยาวอาจทำให้เกิดการโอเวอร์โฟลว์และอักขระสายอักขระบางตัวถูกตัดทอน ในเวลาเดียวกัน สตริงการสืบค้นจะปรากฏในแถบที่อยู่ของเบราว์เซอร์และในลิงก์และรายการโปรดที่บันทึกไว้ทั้งหมด ไม่เพียงเท่านั้น แต่ยังเปิดเผยค่าที่ไม่ต้องการในคำขอ HTTP เมื่อผ่านเว็บเซิร์ฟเวอร์ และอาจปรากฏในไฟล์บันทึกของเซิร์ฟเวอร์ของคุณและเซิร์ฟเวอร์เส้นทางอื่น ๆ ค่าในส่วนหัวคำขอ HTTP แทบจะมองไม่เห็นและไม่ปรากฏในไฟล์บันทึก
ปัญหาเล็กๆ ที่ควรทราบในการใช้วิธี POST คือเมื่อผู้ใช้ดาวน์โหลด <FORM> อีกครั้ง ค่าของแบบฟอร์มจะไม่คงอยู่อีกต่อไป และค่าจะว่างเปล่าและต้องป้อนใหม่ อย่างไรก็ตาม เมื่อแนบไปกับ URL ค่าจะถูกจัดเก็บเป็นลิงก์และจะถูกเก็บไว้ ดังนั้นจะปรากฏในคำขอทั้งหมดที่รวม URL เข้ากับสตริง นี่อาจเป็นข้อดีหรือข้อเสีย ขึ้นอยู่กับแอปพลิเคชัน (เบราว์เซอร์บางตัว สามารถเก็บค่าบนเพจภายในช่วงที่กำหนดบนไคลเอนต์ได้โดยอัตโนมัติ)
อีกประเด็นหนึ่งคือการรวมกันของ URL และสตริงการสืบค้นต้องไม่มีช่องว่างหรืออักขระที่ผิดกฎหมายอื่น ๆ มิฉะนั้น Navigator และเบราว์เซอร์อื่น ๆ บางตัวจะมีปัญหา อักขระที่ผิดกฎหมายคืออักขระที่ใช้เพื่อแยก URL และสตริงการสืบค้น เช่น "/", ; uma, "?" และ "&" (IE สามารถแปลงช่องว่างให้อยู่ในรูปแบบที่ถูกต้องได้โดยอัตโนมัติ - เครื่องหมายบวก "+" แต่ อักขระที่ผิดกฎหมายอื่นๆ ไม่สามารถประมวลผลได้)
การใช้คุกกี้ใน ASP
ในส่วนนี้เราจะเรียนรู้เทคนิคต่างๆ ที่ให้คอลเลกชัน วิธีการ และคุณสมบัติสำหรับการใช้งานโดยโค้ด ASP
1) รายละเอียดผู้ใช้จะถูกจัดเก็บไว้ในคุกกี้
สามารถใช้คุกกี้เพื่อจัดเก็บค่าได้ 2 ประเภท ได้แก่ ค่าที่เราไม่ต้องการบันทึกเมื่อปิดเบราว์เซอร์ (เช่น ข้อมูลการลงทะเบียนผู้ใช้) และค่าที่เราต้องการ เก็บไว้เมื่อผู้ใช้เยี่ยมชมเว็บไซต์ ในแต่ละกรณี ค่าของคุกกี้จะพร้อมใช้งานสำหรับ ASP สำหรับทุกคำขอเพจจากเบราว์เซอร์ของผู้ใช้
อย่างไรก็ตาม คุณต้องจำไว้ว่าคุกกี้จะถูกส่งไปยังเซิร์ฟเวอร์เมื่อมีการร้องขอสำหรับเพจภายในเส้นทางเสมือน (เส้นทาง) ในคุกกี้เท่านั้น ตามค่าเริ่มต้น หากไม่ได้ตั้งค่าเส้นทางไว้ในคุกกี้ ค่าของเส้นทางจะเป็นเส้นทางเสมือนของเพจที่สร้างคุกกี้ หากต้องการส่งคุกกี้ไปยังทุกหน้าของไซต์ จำเป็นต้องใช้ path="/"
นี่คือตัวอย่าง จากหน้าเข้าสู่ระบบที่กำหนดเอง ข้อมูลการลงทะเบียนของผู้ใช้จะถูกจัดเก็บไว้ในคุกกี้ เนื่องจากไม่มีระยะเวลาที่ใช้งานได้ ค่าคุกกี้จึงจะถูกเก็บไว้จนกว่าเบราว์เซอร์จะปิดเท่านั้น:
...
Request.Cookies(“ผู้ใช้”)(“UID”) = “<% = คำขอ(“ชื่อผู้ใช้”) %>”
คำขอคุกกี้ (“ผู้ใช้”)(“PWD”) = “<% = คำขอ (“รหัสผ่าน”) %>”
Request.Cookies(“User”).Path = “/adminstuff” 'ใช้กับหน้าผู้ดูแลระบบเท่านั้น
...
คุกกี้นี้จะพบได้ในทุกหน้าที่ผู้ใช้ร้องขอจากไดเร็กทอรีผู้ดูแลระบบหรือไดเร็กทอรีย่อย หากไม่มีอยู่ คุณสามารถเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการลงทะเบียน:
If (Request.Cookies("User")("UID") <> "alexhomer") _
หรือ (Request.Cookies("User")("PWD") <> "secret") จากนั้น
Response.Redirect “login.asp?UserName=” & Request.Cookies(“ผู้ใช้”)(“UID”)
สิ้นสุดถ้า
...
เนื่องจากชื่อผู้ใช้ในคุกกี้ถูกวางไว้ในสตริงการสืบค้น URL ของ Response.Redirect หากมีข้อผิดพลาดเกิดขึ้นเมื่อป้อนรหัสผ่านและคุณต้องการให้ผู้ใช้ไม่ต้องพิมพ์ชื่อผู้ใช้ซ้ำ คุณสามารถใช้ชื่อผู้ใช้นั้นในการเข้าสู่ระบบได้ หน้า asp:
<FORM ACTION=”check_user.asp” METHOD=”POST”>
<ประเภทอินพุต=”ข้อความ” NAME=”ชื่อผู้ใช้”
VALUE=”<% = Request.QueryString(“ชื่อผู้ใช้”) %>”><P>
<ประเภทอินพุต=”ส่ง” ค่า=”เข้าสู่ระบบ”>
</FORM>
2) แก้ไขคุกกี้ที่มีอยู่
คุณสามารถใช้ ASP เพื่อแก้ไขคุกกี้ที่มีอยู่ แต่คุณไม่สามารถแก้ไขเพียงค่าเดียวในคุกกี้ได้ เมื่ออัปเดตคุกกี้ในคอลเลกชัน Response.Cookies ค่าที่มีอยู่จะหายไป เราสามารถสร้างคุกกี้ด้วยโค้ดต่อไปนี้ ซึ่งสามารถใช้ได้:
Response.Cookies("VisitCount")("StartDate") = dtmStart
Response.Cookies("VisitCount")("LastDate") = ตอนนี้
Response.Cookies("VisitCount")("การเข้าชม") = CStr(intVisits)
Response.Cookies("VisitCount").Path = "/" 'ใช้กับทั้งไซต์
Response.Cookies("VisitCount").Expires = DateAdd("m",3,Now)
หากคุณต้องการอัปเดตค่าของ Visits และ LastDate คุณต้องไม่เปลี่ยนค่าทั้งหมดก่อน จากนั้นจึงเขียนคุกกี้ทั้งหมดใหม่ :
datDtart = Response .Cookies("VisitCount")("StartDate")
intVisits = Response.Cookies("VisitCount")("การเข้าชม")
Response.Cookies("VisitCount")("StartDate") = dtmStart
Response.Cookies("VisitCount")("LastDate") = ตอนนี้
Response.Cookies("VisitCount")("การเข้าชม") = Cstr(intVisits)
Response.Cookies (“VisitCount”).Path = “/”
Response.Cookies("VisitCount").Expires = DateADD("m",3,Now + 1) และเช่นเดียวกับวิธีการและคุณสมบัติการตอบสนองอื่นๆ เกือบทั้งหมด ควรทำก่อนที่จะเขียนสิ่งใดๆ (เช่น เปิดแท็ก <HTML> หรือ ข้อความใด ๆ หรือ HTML อื่น ๆ ) ต่อการตอบกลับ