〓บทนำ〓
ใครก็ตามที่มีสามัญสำนึกรู้ดีว่าการใช้ ASP ในการทำงานนี้เป็นเรื่องยุ่งยากอย่างเห็นได้ชัด เนื่องจากไม่ใช่การส่งข้อความโต้ตอบแบบทันทีเช่นห้องสนทนา QQ, MSN หรือ IRC พวกเขาทั้งหมดอาศัยการรีเฟรชหน้าเว็บเพื่อเปลี่ยนเวลากิจกรรมล่าสุด เพื่อดูว่าผู้ใช้ออนไลน์อยู่หรือไม่ ดังนั้นอย่าคาดหวังว่าบทช่วยสอนต่อไปนี้จะสมบูรณ์แบบ ฉันเพิ่งบันทึกโหมดการคิดของฉัน หากมีอะไรผิดปกติ โปรดขอคำแนะนำจากผู้เชี่ยวชาญ
-------------------------------------------------- -------------------------------------------------- ----------------------------------
〓ข้อความ〓
ก่อนอื่น ให้ฉันแนะนำแนวคิดของฉันในการบรรลุผลนี้แก่คุณ หากคุณเข้าใจหลังจากอ่านแนวคิดของฉันแล้ว ก็ไม่จำเป็นต้องอ่านบทความนี้...
ฉันคิดได้เพียงสองวิธีในการใช้ฟังก์ชันนี้:
1. ฐานข้อมูล+asp
อาจจะซับซ้อนกว่าการทำแต่เหมาะกับระบบที่มีผู้ใช้งานล็อกอินจำนวนมาก
2. แอปพลิเคชัน
ใช้ออบเจ็กต์แอปพลิเคชัน: หากคุณกำลังสร้างชุมชนขนาดใหญ่ คุณอาจต้องสร้างแอปพลิเคชันสำหรับ ID การเข้าสู่ระบบแต่ละรายการ แม้ว่าการออกแบบโปรแกรมจะง่ายกว่า แต่มีผู้ใช้ที่เข้าสู่ระบบมากเกินไปและฉันจะไม่ใช้ทรัพยากรเซิร์ฟเวอร์เลย สนับสนุนที่นี่ เพราะมันง่ายที่จะสร้าง appliaction object เมื่อผู้ใช้เข้าสู่ระบบ แต่จะต้องถูกปล่อยออกมาอย่างสมบูรณ์เมื่อผู้ใช้ออกจากระบบ จนถึงตอนนี้ ฉันยังไม่เคยเห็นวิธีที่ดีกว่านี้เลย
ถ้าอย่างนั้นเรามาดูวิธีใช้ฐานข้อมูล + ASP แก้ปัญหาบัญชีเดียวกันไม่สามารถเข้าสู่ระบบพร้อมกันได้!
ขั้นแรกขอให้ผู้ใช้สร้างฐานข้อมูล ที่นี่เราใช้การเข้าถึงเพื่อสร้าง onlyNet118.mdb ใหม่
ตารางข้อมูล 1: ผู้ใช้จัดเก็บข้อมูลการลงทะเบียนผู้ใช้
ตารางข้อมูลต่อไปนี้ได้รับการตั้งค่า: uID (หมายเลขอัตโนมัติ) ชื่อผู้ใช้ (ประเภทอักขระ) userPass (ประเภทอักขระ)
ตารางข้อมูล 2: onlyLogin จัดเก็บข้อมูลการเข้าสู่ระบบชั่วคราวของผู้ใช้
ตารางข้อมูลต่อไปนี้ได้รับการตั้งค่า: OLname (ประเภทตัวอักษร) OLtime (ประเภทวันที่) OLip (ประเภทตัวอักษร)
หลังจากสร้างฐานข้อมูลแล้ว เราจะเพิ่มข้อมูลลงในตารางผู้ใช้โดยตรง เพิ่ม Net118 ลงในตารางชื่อผู้ใช้ และเพิ่ม 111 ลงในตาราง userPass เพื่อเน้นจุดเน้นของการสนทนาของเราในบทความนี้และลบรหัสผ่านที่ไม่จำเป็นออกไป ไม่ควรเข้ารหัส และชื่อผู้ใช้ควรเป็นของตัวเอง เพิ่ม~ฮ่าฮ่า~
เอาล่ะ ขณะนี้มีฐานข้อมูลผู้ใช้อยู่ในฐานข้อมูลแล้ว มาสร้างส่วนติดต่อผู้ใช้เข้าสู่ระบบกันดีกว่า
<html>
<หัว>
<meta http-equiv=เนื้อหาประเภทเนื้อหา=ข้อความ/html;
<title>Net118.COM ห้ามมิให้เข้าสู่ระบบพร้อมกันของบัญชีเดียวกันจากภูมิภาคที่แตกต่างกัน</title>
</หัว>
<ร่างกาย>
<ชื่อฟอร์ม=form1วิธีการ=ลงรายการบัญชีการกระทำ=loginPost.asp>
ชื่อผู้ใช้: <input name=userName type=text id=userName size=15 maxlength=5>
รหัสผ่าน: <ชื่ออินพุต=ประเภท userPass=รหัสผ่าน id=ขนาด userPass=15 ความยาวสูงสุด=15>
<ประเภทอินพุต=ชื่อส่ง=ค่าส่ง=เข้าสู่ระบบ>
</แบบฟอร์ม>
</ร่างกาย>
</html>
หลังจากเสร็จสิ้น ให้สร้างไฟล์ loginCONN.asp ใหม่ คัดลอกโค้ดด้านล่างแล้วบันทึก! มันเชื่อมต่อกับฐานข้อมูล ฉันจะไม่อธิบายมากขนาดนี้...
-
หรี่ CONN_Net118
ดิมคอนน์_T
ดิ่ม มมดด
mmdd=เฉพาะNet118.mdb
ตั้งค่า CONN_Net118 = Server.CreateObject (ADODB.Connection)
Conn_T=ผู้ให้บริการ=Microsoft.Jet.OLEDB.4.0;แหล่งข้อมูล= & Server.MapPath(&mmdd&)
เมื่อเกิดข้อผิดพลาดดำเนินการต่อต่อไป
CONN_Net118.เปิด Conn_T
-
ต่อไปเราจะสร้างไฟล์ loginPost.asp ที่มีอยู่ในไดเร็กทอรีนี้ด้วย สิ่งนี้สำคัญกว่า ดูโค้ดต่อไปนี้อย่างละเอียด:
<!--#include file=loginCONN.asp -->
-
'ลบผู้ใช้ที่ใช้งานภายในเวลา maxTime, maxTime ถูกกำหนดไว้ในไฟล์ loginCONN.asp
Conn_Net118.Execute (ลบจาก onlyLogin โดยที่ DATEDIFF('s',OLtime, now()) > & maxTime & )
'=================================================' = ===============
หรี่ rs, ts, txt, sql, ชื่อผู้ใช้, userPass
ถ้า Request.Form(Submit)=Login แล้ว
userName=Request.Form(userName)'รับแบบฟอร์มชื่อล็อกอินของผู้ใช้
userPass=Request.Form(userPass)' รับแบบฟอร์มรหัสผ่านเข้าสู่ระบบของผู้ใช้
'เนื่องจากเราไม่ได้พูดถึงปัญหาด้านความปลอดภัยที่นี่ รหัสผ่านของผู้ใช้จึงไม่ได้เข้ารหัส
ตั้ง rs = Server.CreateObject (ADODB.RECORDSET)
sql=SELECT * จากผู้ใช้โดยที่ userName = ' & userName & ' และ userPass = ' & userPass & '
rs.เปิด sql, CONN_Net118,1,1
ถ้าไม่ใช่ rs.eof แล้ว
โทร isOK(userName) ' เรียกกระบวนการนี้หากชื่อผู้ใช้และรหัสผ่านถูกต้อง isOK จะถูกปรับแต่งในโปรแกรมต่อไปนี้
อื่น
Response.Write(<a href=javascript:history.go(-1)>ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง</a>)
การตอบสนองสิ้นสุด()
สิ้นสุดถ้า
rs.ปิด
ตั้งค่า rs=ไม่มีอะไร
สิ้นสุดถ้า
ย่อย isOK (ชื่อผู้ใช้)
Dim Olip 'IP ที่บันทึกโดยชื่อผู้ใช้เข้าสู่ระบบปัจจุบันในฐานข้อมูล
Dim Oltime ' ครั้งล่าสุดที่เว็บเพจถูกรีเฟรชเมื่อมีการบันทึกชื่อผู้ใช้ล็อกอินปัจจุบันในฐานข้อมูลถือเป็นข้อมูลสำคัญในการคำนวณว่าผู้ใช้ออนไลน์อยู่หรือไม่
Dim OLip1 'บันทึก IP การเข้าสู่ระบบของผู้ใช้ปัจจุบัน ใช้เพื่อแยกแยะว่าเป็นผู้ใช้คนเดียวกันหรือไม่
OLip1=Request.ServerVariables(REMOTE_ADDR)'รับ IP ของผู้ใช้ที่ส่งข้อมูลการเข้าสู่ระบบ
ตั้งค่า ts=Conn_Net118.execute (เลือก * จากเท่านั้นเข้าสู่ระบบ WHERE OLname='& ชื่อผู้ใช้ & ')
หากไม่ใช่ ts.eof ให้ ' ค้นหาฐานข้อมูลเพื่อดูว่ามีข้อมูลการเข้าสู่ระบบสำหรับผู้ใช้รายนี้หรือไม่
OLtime=ts(OLtime)
OLip=ts(OLip)
ถ้า OLip1<>OLip และ DateDiff(s,OLtime,now()) < maxTime แล้ว
'ประโยคก่อนหน้านี้กำหนดว่า IP ผู้ใช้เข้าสู่ระบบที่ส่งไม่ใช่ IP ผู้ใช้ที่บันทึกไว้ล่าสุดในฐานข้อมูลและ
'หากความแตกต่างระหว่างเวลากิจกรรมล่าสุดของผู้ใช้และเวลาปัจจุบันไม่เกินจำนวนวินาทีที่ระบุ จะได้รับการยืนยันว่าผู้ใช้กำลังออนไลน์อยู่
Response.Write <a href=javascript:history.go(-1)>ผู้ใช้รายนี้ออนไลน์อยู่ คุณไม่สามารถเข้าสู่ระบบบัญชีนี้จากที่อื่นได้! </a>
การตอบสนองสิ้นสุด()
อื่น
'มิฉะนั้น จะถือว่าการเข้าสู่ระบบสำเร็จและจะมีการจ่ายมูลค่าให้กับเซสชัน
เซสชั่น(lgName)=ชื่อผู้ใช้
เซสชั่น(lgPass)=userPass
Response.Redirect เข้าสู่ระบบ OK.asp
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
อื่น
'หากฐานข้อมูลไม่มีบันทึกผู้ใช้เข้าสู่ระบบ ให้ดำเนินการคำสั่งต่อไปนี้
ดิม ลส
ตั้งค่า ls=Server.CreateObject(ADODB.RECORDSET)
ls.OpenSelect * จาก onlyLogin,CONN_Net118,2,2
ls.เพิ่มใหม่
ls(OLname)=ชื่อผู้ใช้
ls(OLip)=OLip1
ls(OLtime)=ตอนนี้()
ls.UPDATE
ล.ปิด
ตั้ง ls=ไม่มีอะไร
'ตรวจสอบการเข้าสู่ระบบที่สำเร็จและชำระค่าเซสชัน'
เซสชั่น(lgName)=ชื่อผู้ใช้
เซสชั่น(lgPass)=userPass
Response.Redirect เข้าสู่ระบบ OK.asp
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
สิ้นสุดย่อย %>
หากคุณเข้าใจไฟล์ asp ได้ คุณจะรู้ได้ทันทีว่าหลังจากล็อกอินสำเร็จ leaf จะข้ามไปที่ loginOK.asp มาดูโค้ดของ leaf นี้กันทันที
<ประเภทสไตล์=ข้อความ/css>
-
เนื้อความ {สีพื้นหลัง: #FF9900;}
-
</สไตล์>
<% ถ้าเซสชัน (lgName)<> แล้วก็ %>
คุณเข้าสู่ระบบสำเร็จแล้ว! - - ต่อไปนี้เป็น iframe ที่แอบเข้าไปในหน้าเว็บเพื่อรีเฟรชหน้าเว็บตามเวลาที่กำหนดและรายงานไปยังเซิร์ฟเวอร์ว่าคุณออนไลน์อยู่หรือไม่
เพื่ออำนวยความสะดวกในการแยกแยะ เราใช้สีขาวเป็นสีพื้นหลังสำหรับหน้าเว็บเฟรม
<เส้นขอบ iframe=0 ชื่อ=new_date ความกว้างของขอบ=0 เฟรมระยะห่าง=0 ความสูงขอบ=0 src=loginFrame.asp
frameborder=0 noResize width=100 scrolling=no height=30 vspale=0></iframe>
<% อื่น ๆ %>
คุณยังไม่ได้เข้าสู่ระบบ ยินดีต้อนรับสู่เครือข่ายข้อมูลผู้ดูแลเว็บ: http://www.Net118.com
<% สิ้นสุดถ้า %>
หากคุณเป็นคนระมัดระวัง คุณจะรู้ได้ทันทีว่าสิ่งที่เราต้องทำต่อไปคือ loginFrame.asp
<!--#include file=loginCONN.ASP -->
<% CONN_Net118.Execute (อัปเดต onlyLogin Set OLtime='& NOW() & ' โดยที่ OLname = ' & เซสชัน (lgName) & ') %>
<html><head><meta http-equiv=รีเฟรชเนื้อหา=<%=(maxTime-5)%>; url=></head></html>
โอเค จนถึงตอนนี้โปรแกรมของเราเสร็จสมบูรณ์แล้ว กุญแจสำคัญของโปรแกรมนี้คือการตรวจสอบว่าผู้ใช้ออนไลน์อยู่หรือไม่ และฉันไม่มีทางเลือกอื่นนอกจากใช้ FRAME เพื่อซ้อนคีย์ลีฟที่รีเฟรชเป็นประจำเพื่อตรวจสอบว่าผู้ใช้ออนไลน์อยู่ในลีฟหรือไม่ ของโปรแกรมหลัก ที่นี่ ในการทำงานจริง คุณสามารถเปลี่ยนความกว้างและความสูงของ iframe ให้เป็น 0 เพื่อให้ผู้ใช้ทั่วไปไม่สามารถมองเห็นได้ หรือทำให้สีพื้นหลังของหน้าเว็บของโปรแกรมหลักเหมือนกับสีของโปรแกรมหลัก ซ้อนหน้าเว็บรีเฟรชเป็นประจำ และจะไม่เป็นไร
ไม่นานมานี้ ฉันเห็นใครบางคนในฟอรัมสนทนาบอกว่าสามารถกำหนดได้โดยใช้สิ่งต่าง ๆ เช่น เซสชันและคุกกี้ ซึ่งเห็นได้ชัดว่าเป็นไปไม่ได้ เนื่องจากออบเจ็กต์ที่พวกเขาสร้างขึ้นนั้นทำงานได้ด้วยตัวเองเท่านั้น และเนื้อหาข้อมูลของพวกเขาไม่สามารถแชร์กับผู้ใช้รายอื่นได้ ทั้งหมด แบ่งปัน Appliaction ควรเป็นอีกวิธีหนึ่งในการบรรลุวัตถุประสงค์นี้ แต่ฉันล้มเลิกแนวคิดนี้เมื่อฉันคิดว่าหากมีผู้ใช้จำนวนมากที่เข้าสู่ระบบในเวลาเดียวกัน จะมีการสร้างออบเจ็กต์ appliaction อย่างน้อยหนึ่งถึงสามรายการสำหรับผู้ใช้แต่ละคน เพราะจากนั้นแอปดั้งเดิมของเรา เซิร์ฟเวอร์ที่ไม่ดี จะถูกลากลงอย่างแน่นอน~