1. การแนะนำสั้น ๆ เกี่ยวกับเซสชั่น
ในการพัฒนาเว็บเซิร์ฟเวอร์สามารถสร้างวัตถุเซสชัน (วัตถุเซสชัน) สำหรับเบราว์เซอร์ของผู้ใช้แต่ละคน หมายเหตุ: เบราว์เซอร์เป็นเจ้าของวัตถุเซสชันโดยเฉพาะ (โดยค่าเริ่มต้น) ดังนั้นเมื่อจำเป็นต้องบันทึกข้อมูลผู้ใช้โปรแกรมเซิร์ฟเวอร์สามารถเขียนข้อมูลผู้ใช้ลงในเซสชันพิเศษกับเบราว์เซอร์ของผู้ใช้ เมื่อผู้ใช้ใช้เบราว์เซอร์เพื่อเข้าถึงโปรแกรมอื่น ๆ โปรแกรมอื่น ๆ สามารถดึงข้อมูลของผู้ใช้จากเซสชันของผู้ใช้เพื่อให้บริการผู้ใช้
2. ความแตกต่างหลักระหว่างเซสชันและคุกกี้
คุกกี้ เป็นเบราว์เซอร์ที่เขียนข้อมูลของผู้ใช้ให้กับผู้ใช้
เทคโนโลยี เซสชัน เขียนข้อมูลผู้ใช้ในเซสชันของผู้ใช้
วัตถุ เซสชัน ถูกสร้างขึ้นโดยเซิร์ฟเวอร์และนักพัฒนาสามารถเรียกวิธีการ getSession ของวัตถุคำขอเพื่อรับวัตถุเซสชัน
3. หลักการการใช้งานเซสชัน
3.1. เซิร์ฟเวอร์ใช้เซสชันเพื่อให้บริการเบราว์เซอร์ของผู้ใช้อย่างไร
หลังจากเซิร์ฟเวอร์สร้างเซสชันมันจะเขียนหมายเลขรหัสเซสชันกลับไปยังไคลเอนต์ในรูปแบบของคุกกี้ ด้วยวิธีนี้ตราบใดที่เบราว์เซอร์ของลูกค้าไม่ได้ปิดเมื่อเข้าถึงเซิร์ฟเวอร์มันจะนำหมายเลขรหัสเซสชัน เมื่อเซิร์ฟเวอร์พบว่าเบราว์เซอร์ไคลเอนต์มี ID เซสชันจะใช้เซสชันที่เกี่ยวข้องในหน่วยความจำเพื่อให้บริการ สามารถพิสูจน์ได้ด้วยรหัสต่อไปนี้:
แพ็คเกจ xdp.gacl.session; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservlet นำเข้า javax.servlet.http.httpservletRequest; javax.servlet.http.httpsession; นำเข้า javax.servlet.http.httpsession; นำเข้า Javax.servlet.http.httpsession; คลาสสาธารณะเซสชัน DEMO1 ขยาย HTTPSERVLETS Response.Setcharacterencoding ("UTF = 8"); Response.setContentType ("ข้อความ/html; charset = utf-8"); // ใช้ getSession () ของวัตถุคำขอเพื่อรับเซสชัน หากเซสชันไม่มีอยู่ให้สร้างเซสชัน httpsession = request.getSession (); // จัดเก็บข้อมูลในเซสชันเซสชัน SetAttribute ("ข้อมูล", "Lonely Canglang"); // รับ ID ของสตริงเซสชัน sessionid = session.getId (); // ตัดสินว่าเซสชั่นถูกสร้างขึ้นใหม่ถ้า (session.isnew ()) {response.getWriter (). พิมพ์ ("เซสชันถูกสร้างขึ้นสำเร็จรหัสเซสชันคือ:"+sessionid); } else {response.getWriter (). พิมพ์ ("เซสชันมีอยู่แล้วในเซิร์ฟเวอร์รหัสของเซสชันคือ:"+เซสชัน RESSION); }} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบกลับ); -เมื่อเข้าถึงเป็นครั้งแรกเซิร์ฟเวอร์จะสร้างเซสชันใหม่และส่งรหัสเซสชันไปยังเบราว์เซอร์ไคลเอนต์ในรูปแบบของคุกกี้ดังที่แสดงในรูปด้านล่าง:
คลิกปุ่มรีเฟรชและขอเซิร์ฟเวอร์อีกครั้ง ในเวลานี้คุณจะเห็นว่าเมื่อเบราว์เซอร์ร้องขอเซิร์ฟเวอร์อีกครั้งรหัสเซสชันที่เก็บไว้ในคุกกี้จะถูกส่งผ่านไปยังฝั่งเซิร์ฟเวอร์ด้วยกันดังแสดงในรูปด้านล่าง:
ฉันเดาวิธีการ request.getSession () ต้องทำการประมวลผลต่อไปนี้หลังจากเซสชันที่สร้างขึ้นใหม่ภายใน
// รับเซสชัน idstring sessionid = session.getId (); // การจัดเก็บรหัสเซสชันในคุกกี้ที่มีชื่อคุกกี้ JSessionId คุกกี้ = คุกกี้ใหม่ ("jsessionid", เซสชัน); // ตั้งเส้นทางที่ถูกต้องของคุกกี้คุกกี้ SetSetPath Response.addcookie (คุกกี้);4. การประมวลผลเซสชันหลังจากเบราว์เซอร์ปิดการใช้งานคุกกี้
4.1. IE8 ปิดการใช้งานคุกกี้
เครื่องมือ -> ตัวเลือกอินเทอร์เน็ต -> ความเป็นส่วนตัว -> การตั้งค่า -> ดึงแถบเลื่อนไปด้านบน (บล็อกคุกกี้ทั้งหมด)
4.2. วิธีแก้ปัญหา: URL เขียนซ้ำ
Response.encoderedirecturl (java.lang.string url) ใช้เพื่อเขียนที่อยู่ URL ใหม่หลังจากวิธีการส่งผ่าน
Response.encodeurl (java.lang.string url) ใช้เพื่อเขียนที่อยู่ URL ของการกระทำแบบฟอร์มและไฮเปอร์ลิงก์ใหม่
4.3. ตัวอย่าง: หลังจากปิดการใช้งานคุกกี้ Servlets จะแบ่งปันข้อมูลในเซสชัน
indexservlet
แพ็คเกจ xdp.gacl.session; นำเข้า java.io.ioexception; นำเข้า java.io.printwriter; นำเข้า java.util.linkedhashmap; นำเข้า java.util.map; นำเข้า java.util.set; นำเข้า Javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {response.setContentType ("text/html; charset = utf-8"); PrintWriter out = response.getWriter (); // สร้าง request.getSession (); out.write ("เว็บไซต์นี้มีหนังสือต่อไปนี้: <br/>"); set <map.entry <string, book >> set = db.getall (). entrySet (); สำหรับ (map.entry <string, book> me: set) {book book = me.getValue (); string url = request.getContextPath () + "/servlet/buyServlet? id =" + book.getId (); //การตอบสนอง. encodeUrl (java.lang.string url) ใช้เพื่อเขียนการกระทำแบบฟอร์มใหม่และที่อยู่ URL ของ HyperLink URL = Response.encodeUrl (URL); // เขียนที่อยู่ URL ใหม่ของไฮเปอร์ลิงก์ออก. }} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบกลับ); }}/*** @author gacl* จำลองฐานข้อมูล*/คลาส db {แผนที่คงที่ส่วนตัว <สตริง, หนังสือ> แผนที่ = ใหม่ linkedhashmap <สตริง, หนังสือ> (); Static {map.put ("1", หนังสือเล่มใหม่ ("1", "การพัฒนา Javaweb")); map.put ("2", หนังสือเล่มใหม่ ("2", "การพัฒนาฤดูใบไม้ผลิ")); map.put ("3", หนังสือเล่มใหม่ ("3", "การพัฒนาไฮเบอร์เนต")); map.put ("4", หนังสือเล่มใหม่ ("4", "Struts Development")); map.put ("5", หนังสือเล่มใหม่ ("5", "Ajax Development")); } แผนที่สาธารณะคงที่ <สตริง, หนังสือ> getAll () {กลับแผนที่; }} ชั้นเรียนหนังสือ {รหัสสตริงส่วนตัว; ชื่อสตริงส่วนตัว; หนังสือสาธารณะ () {super (); } หนังสือสาธารณะ (รหัสสตริงชื่อสตริง) {super (); this.id = id; this.name = ชื่อ; } สตริงสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (รหัสสตริง) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; -ซื้อ
แพ็คเกจ xdp.gacl.session; นำเข้า java.io.ioexception; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; นำเข้า javax.servlet.http.httpsession; คลาสสาธารณะ Buyservlet ขยาย httpservlet {โมฆะสาธารณะ doget (httpservletrequest คำขอ httpservletresponse หนังสือหนังสือ = db.getall (). รับ (id); // รับหนังสือที่ผู้ใช้ต้องการซื้อ httpsession session = request.getSession (); รายการ <book> list = (list) session.getAttribute ("list"); // รับคอนเทนเนอร์ที่ผู้ใช้ใช้เพื่อบันทึกหนังสือทั้งหมดถ้า (list == null) {list = new ArrayList <Book> (); session.setAttribute ("รายการ", รายการ); } list.add (หนังสือ); //การตอบสนอง. encoderedirecturl (java.lang.String url) ใช้เพื่อเขียนที่อยู่ URL ใหม่หลังจากวิธีการส่งสัญญาณ url url = response.encoderedirecturl (request.getContextPath ()+"/servlet/listcartservlet"); System.out.println (URL); Response.sendredirect (URL); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {doget (คำขอ, การตอบสนอง); -ListCartservlet
แพ็คเกจ xdp.gacl.session; นำเข้า java.io.ioexception; นำเข้า java.io.printwriter; นำเข้า java.util.list; นำเข้า javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; นำเข้า Javax.servlet.http.httpsession; คลาสสาธารณะ ListCartservlet ขยาย httpservlet {โมฆะสาธารณะ doget (httpservletRequest คำขอ Response.setContentType ("ข้อความ/html; charset = utf-8"); PrintWriter out = response.getWriter (); httpsession session = request.getSession (); รายการ <book> list = (list) session.getAttribute ("list"); if (list == null || list.size () == 0) {out.write ("ขออภัยคุณยังไม่ได้ซื้อผลิตภัณฑ์ใด ๆ เลย !!"); กลับ; } // แสดงผลิตภัณฑ์ที่ซื้อโดยผู้ใช้ Out.write ("คุณซื้อผลิตภัณฑ์ต่อไปนี้: <br>"); สำหรับ (หนังสือหนังสือ: รายการ) {out.write (book.getName () + "<br/>"); }} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบกลับ); -เอฟเฟกต์การดำเนินการภายใต้ IE8 ที่มีการปิดใช้งานคุกกี้มีดังนี้:
ผลการสาธิต
โดยการดูรหัส HTML ที่สร้างโดย IdexServlet คุณจะเห็นว่าไฮเปอร์ลิงก์แต่ละตัวมีรหัสเซสชันตามด้วยดังที่แสดงด้านล่าง
// เว็บไซต์นี้มีหนังสือต่อไปนี้: <br/> การพัฒนา Javaweb <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionid = 96bdfb9d87a08d5ab1ea2537cde2db2? href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionid = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 2'> ซื้อ </a> <br/> // href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionid = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 3'> ซื้อ </a> <br/> href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionid = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 4'> ซื้อ </a> <br/> // href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionid = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 5'> ซื้อ </a> <br/>
ดังนั้นเมื่อเบราว์เซอร์ปิดการใช้งานคุกกี้มันสามารถเขียนโซลูชันนี้ด้วย URL เพื่อแก้ปัญหาการแบ่งปันข้อมูลเซสชัน นอกจากนี้การตอบสนอง encoderedirecturl (java.lang.string url) และการตอบสนอง encodeUrl (java.lang.string url) เป็นสองวิธีที่ชาญฉลาดมาก เมื่อตรวจพบว่าเบราว์เซอร์ไม่ปิดใช้งานคุกกี้ URL เขียนซ้ำจะไม่ถูกดำเนินการ เราเข้าถึงได้ภายใต้เบราว์เซอร์ Firefox โดยไม่ปิดใช้งานคุกกี้เอฟเฟกต์มีดังนี้:
ดังที่เห็นได้จากภาพเคลื่อนไหวสาธิตเมื่อเบราว์เซอร์เข้าถึงครั้งแรกเซิร์ฟเวอร์จะสร้างเซสชันแล้วส่ง ID ของเซสชันกลับไปที่เบราว์เซอร์ในรูปแบบของคุกกี้ การตอบสนอง วิธีการ encodeUrl (java.lang.string url) ยังเขียน URL ใหม่ เมื่อปุ่มรีเฟรชถูกคลิกสำหรับการเยี่ยมชมครั้งที่สองเบราว์เซอร์ Firefox จะไม่ปิดการใช้งานคุกกี้ดังนั้นจึงนำคุกกี้มาเยี่ยมครั้งที่สอง ในเวลานี้เซิร์ฟเวอร์สามารถรู้ได้ว่าเบราว์เซอร์ไคลเอนต์ปัจจุบันไม่ปิดใช้งานคุกกี้ดังนั้นจึงแจ้งการตอบกลับ วิธีการ encodeurl (java.lang.string url) ที่ไม่จำเป็นต้องเขียน URL ใหม่
5. ช่วงเวลาของการสร้างและทำลายวัตถุเซสชัน
5.1. เวลาสร้างของวัตถุเซสชัน
เซสชันใหม่จะถูกสร้างขึ้นเมื่อมีการเรียกใช้วิธีการร้องขอ. getSession () เป็นครั้งแรกในโปรแกรม คุณสามารถใช้เมธอด isNew () เพื่อตรวจสอบว่าเซสชันถูกสร้างขึ้นใหม่หรือไม่
ตัวอย่าง: สร้างเซสชัน
// ใช้ getSession () ของวัตถุคำขอเพื่อรับเซสชัน หากเซสชันไม่มีอยู่ให้สร้าง httpsession session = request.getSession (); // รับ iDString sessionId = session.getId (); // ตัดสินว่าเซสชันนั้นถูกสร้างขึ้นใหม่หรือไม่ถ้า (session.isnew ()) {response.getWriter () การพิมพ์ (การตอบสนอง) คือ: "+sessionId);}5.2. ช่วงเวลาการทำลายของวัตถุเซสชัน
วัตถุเซสชันไม่ได้ใช้เป็นเวลา 30 นาทีโดยค่าเริ่มต้นและเซิร์ฟเวอร์จะทำลายเซสชันโดยอัตโนมัติ เวลาล้มเหลวของเซสชันสามารถกำหนดค่าด้วยตนเองในไฟล์ web.xml ตัวอย่างเช่น:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app version = "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://ww.w3.org/200 XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" <!-ตั้งค่าเวลาที่ถูกต้องของเซสชัน: ในนาที-> <เซสชัน -Config> <Session-TimeOut> 15 </Session-TimeOut> </ession-config> </eb-app>
เมื่อคุณต้องการตั้งค่าเซสชันให้ล้มเหลวในโปรแกรมด้วยตนเองคุณสามารถเรียกใช้วิธีการเซสชันด้วยตนเองเพื่อทำลายเซสชัน
1 httpsession session = request.getSession ();
2 // เรียกใช้เมธอด session.invalidate ด้วยตนเองเพื่อทำลายเซสชัน
3 session.invalidate ();
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้เซสชัน