วิธีใช้ HTTPSESSION เพื่อใช้บันทึกการเข้าถึง QQ ใน Java บทความนี้จะเปิดเผยคำตอบให้คุณ เนื้อหาเฉพาะมีดังนี้
1. เขียนคลาสข้อมูลอวกาศ QQ (qqs.java)
คลาสสาธารณะ qqs {private static linkedhashmap <จำนวนเต็ม, string> qqs = new LinkedHashMap <จำนวนเต็ม, สตริง> (); Static {qqs.put (10001, "Zhang San"); qqs.put (10002, "li si"); qqs.put (10003, "Wang Wu"); qqs.put (10004, "Zhao Liu"); qqs.put (10005, "tian qi"); qqs.put (10006, "Jiao ba"); qqs.put (10007, "hou jiu"); qqs.put (10008, "Liu Shi"); qqs.put (10009, "Xiao er"); } สาธารณะคงที่ linkedHashMap <จำนวนเต็ม, สตริง> getQqs () {return qqs; -2. เขียนหน้าข้อมูล QQ จริงและประวัติการท่องเว็บ (listservlet.java)
โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// รับอ็อบเจ็กต์วัตถุเซสชัน httpsession เซสชัน = request.getSession (); // ตั้งค่าการตอบสนองข้อมูลภาษาจีน Setcharacterencoding ("UTF-8"); Response.setContentType ("ข้อความ/html; charset = utf-8"); // รับเอาท์พุทสตรีม printwriter out = response.getWriter (); // รับข้อมูล qqs linkedhashmap <จำนวนเต็ม, สตริง> qqs = qqs.getqqs (); ตั้งค่า <map.entry <จำนวนเต็ม, สตริง >> set = qqs.entryset (); ตัววนซ้ำ <map.entry <จำนวนเต็ม, สตริง >> it = set.iterator (); // โครงสร้างหน้าเอาท์พุทออกมา println ("<html> <head> <title> รายการ qq </title> <style> a {margin-right: 20px;} </style> </head> <body>"); out.println ("<hr/> <br/>"); out.println ("<h3> รายการ QQ </h3>"); out.println ("<hr/> <br/>"); out.println ("<hr/> <br/>"); out.println ("<hr/> <br/>"); out.println ("<hr/> <br/>"); // วนลูปไฮเปอร์ลิงก์ของพื้นที่ QQ ในขณะที่ (it.hasnext ()) {map.entry <จำนวนเต็ม, สตริง> รายการ = it.next (); จำนวนเต็ม num = entry.getKey (); ชื่อสตริง = entry.getValue (); out.println ("<a href =/"/day08/store? num = "+num+"/">"+ชื่อ+"</a>"); } // เอาต์พุตข้อมูลการเรียกดูข้อมูลบางอย่างออกมา println ("<hr/> <br/>"); out.println ("<h3> ประวัติการท่องอ่าน QQ </h3>"); out.println ("<hr/> <br/>"); // รับการเข้าถึงบันทึกข้อมูลประวัติสตริง = (สตริง) เซสชัน getAttribute ("ประวัติ"); if (history == null) {out.println ("<font color =/" red/"> ขออภัยไม่มีบันทึกการเข้าถึงในปัจจุบัน ... </font>"); } else {// วนซ้ำผ่านข้อมูลบันทึกที่เข้าถึงโดยสตริงผู้ใช้ [] nums = history.split (","); สำหรับ (String num: nums) {string name = qqs.getqqs (). get (integer.parseint (num)); out.println (ชื่อ+","); }} // ปิดโครงสร้างหน้าออก. println ("</body> </html>"); -3. เขียนหน้าเว็บที่จัดเก็บพื้นที่ QQ (StoreQqServlet.java)
โมฆะสาธารณะ DOGET (คำขอ HTTPSERVLETREQUEST, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// รับวัตถุเซสชัน session session = request.getSession (เท็จ); // รับพารามิเตอร์พารามิเตอร์การร้องขอ num = request.getParameter ("num"); // รับข้อมูลในประวัติสตริงเซสชัน = (สตริง) เซสชัน. getAttribute ("ประวัติ"); // กำหนดข้อมูลถ้า (ประวัติ == null) {// ครั้งแรกเยี่ยมชมเซสชัน SetAttribute ("ประวัติ", num); // history = 10001} else {// เยี่ยมชมหลาย session.setAttribute ("ประวัติ", ประวัติ+","+num); // ตั้งค่าจำนวนของ NUMS และลำดับของสตริงการแสดงผล [] qqs = history.split (","); // แปลงอาร์เรย์เป็นคอลเลกชันที่สะดวกสำหรับรายการการทำงาน <string> list = array.aslist (qqs); // แปลงรายการเป็น LinkedList เพื่ออำนวยความสะดวกในการทำงานของ Data LinkedList <String> linked_list = ใหม่ LinkedList <String> (); linked_list.addall (รายการ); // กำหนดจำนวน QQS ที่ปรากฏหาก (qqs.length <3) {ถ้า (linked_list.contains (num)) {// history = 10002,1003 // ถ้า linked_list.remove (num); linked_list.addfirst (num); } else {// history = 1004,10002,1003 // ถ้า linked_list.addfirst (num); }} else {//> = 3 ถ้า (linked_list.contains (num)) {// history = 10002,10003,10004 10004 // ถ้า linked_list.remove (num); linked_list.addfirst (num); } else {// history = 10005, 10002,10003 // ไม่รวม linked_list.removelast (); linked_list.addfirst (num); }} // บันทึกการเข้าถึงด้วยเวลาที่ดีและคำสั่งซื้อคือ linked_list stringbuffer sb = new StringBuffer (); สำหรับ (สตริง new_num: linked_list) {sb.append (new_num+","); } สตริง new_history = sb.toString (); session.setAttribute ("ประวัติ", new_history); } // เปลี่ยนเส้นทางไปยังการตอบสนองต่อรายการ QQ Sendredirect ("/day08/list"); -รหัสด้านบนจัดเก็บประวัติการท่องเว็บของผู้ใช้ในวัตถุเซสชัน แต่วัตถุอยู่ในหน่วยความจำเซิร์ฟเวอร์และมีเวลา จำกัด เวลาที่ถูกต้อง หากเวลามาถึงเซสชั่นจะถูกทำลาย
เวลาเริ่มต้นคือครึ่งชั่วโมง (30 นาที)
4. กำหนดค่าเวลาที่ถูกต้องของเซสชัน
ใน web.xml ของแต่ละเว็บไซต์คุณสามารถกำหนดค่าเวลาที่ถูกต้องของวัตถุเซสชันที่สร้างขึ้นโดยเว็บไซต์ โปรดทราบว่าหน่วยเป็นนาทีเมื่อกำหนดค่า
thread.slessp (หน่วยมิลลิวินาที), cookie.setMaxage (หน่วยที่สอง), เซสชัน (หน่วยนาที)
<Session-config> <Session-TimeOut> 2 </session-Timeout> หน่วยคือนาที </ession-config>
5 ปิดใช้งานคุกกี้
คุกกี้สามารถใช้ไคลเอนต์เพื่อจัดเก็บข้อมูลเซสชัน
Httpsession สามารถใช้คุกกี้เพื่อจัดเก็บข้อมูล SessionID
ในความเป็นจริงในการตั้งค่าเบราว์เซอร์คุณสามารถปฏิเสธข้อมูลคุกกี้ที่ส่งกลับโดยเว็บไซต์
ในเวลานี้การเข้าถึงกรณีข้างต้นจะทำให้เกิดข้อยกเว้นตัวชี้ว่างที่เกิดขึ้น หากคุณต้องการแก้ไขเว็บไซต์คุณต้องใช้เทคโนโลยี urlrewriting
urlrewriteting
วิเคราะห์สาเหตุของปัญหาข้างต้น:
เซิร์ฟเวอร์ได้สร้างวัตถุเซสชัน แต่เนื่องจากเบราว์เซอร์ห้ามการรับคุกกี้เซิร์ฟเวอร์จึงไม่สามารถส่งค่า ID ของเซสชันที่สร้างขึ้นไปยังเบราว์เซอร์ในรูปแบบของส่วนหัวการตอบสนองของ Set-Cookie สำหรับการจัดเก็บ
วิธีการทั่วไป
String encoderedirecturl (String url) เพิ่มข้อมูล SessionId ไปยัง String การเปลี่ยนเส้นทางที่ระบุ String encodeUrl (String url) เพิ่มข้อมูลเซสชันลงในที่อยู่ URL ปกติ
หลักการของการดำเนินการ:
"รีดที่อยู่ URL ทั้งหมดในหน้าโดยใช้วิธีการข้างต้น"
1 แก้ไขโปรแกรมข้างต้น
1 listservlet.java
String path = "/day08/store? num ="+num; path = response.encodeurl (เส้นทาง); out.println ("<a href = '"+path+"'>"+name+"</a>");2. StoreqqServlet.java
String path = "/day08/list"; path = response.encoderedirecturl (path); response.sendretirect (เส้นทาง);
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน