บทนำเซสชันเซสชัน
เซสชันหมายถึงกระบวนการโต้ตอบระหว่างผู้ใช้ที่ใช้กระบวนการเบราว์เซอร์เดียวกันและเว็บแอปพลิเคชันในช่วงระยะเวลาหนึ่ง
เซสชันมักใช้เพื่อติดตามสถานะของผู้ใช้และแคชข้อมูลของผู้ใช้ในกระบวนการเบราว์เซอร์นี้
เมื่อผู้ใช้ปิดเบราว์เซอร์เซสชันก่อนหน้าจะไม่สามารถรับได้อีกครั้ง (กรณีที่สูงสุดของคุกกี้คือ -1) เปิดเบราว์เซอร์ใหม่อีกครั้งและเซสชั่นใหม่จะเริ่มขึ้น
คลาส javax.servlet.http.httpsession แต่ละ httpsession แสดงถึงเซสชันของผู้ใช้
เวลาหมดอายุของแต่ละเซสชันคือ 30 นาทีโดยค่าเริ่มต้น
เมื่อเบราว์เซอร์เข้าถึงเซิร์ฟเวอร์เป็นครั้งแรกไม่ว่าหน้าใดจะเข้าชมก่อนเซิร์ฟเวอร์จะกำหนดตัวระบุเซสชันที่ไม่ซ้ำกันให้กับผู้ใช้นั่นคือ JSessionId แล้วส่งคืนให้ผู้ใช้ในรูปแบบของคุกกี้
รูปต่อไปนี้คือส่วนหัวการตอบสนอง (รูปต่อไปนี้ขึ้นอยู่กับ Servlet 3.0 และไม่มีแอตทริบิวต์ Httponly ใน Servlet 2.5)
เซิร์ฟเวอร์สร้างเซสชันสำหรับผู้ใช้แต่ละคนคือวัตถุ HTTPSESSION และบันทึกไว้ที่ฝั่งเซิร์ฟเวอร์
ดังนั้นเมื่อผู้ใช้เข้าถึงเซิร์ฟเวอร์อีกครั้งเซิร์ฟเวอร์จะรู้หรือผู้ใช้ปัจจุบันได้อย่างไร
เมื่อเบราว์เซอร์เข้าถึงเซิร์ฟเวอร์อีกครั้งมันจะมีคุกกี้ที่มี JSessionID เพื่อเข้าถึงเซิร์ฟเวอร์ เซิร์ฟเวอร์ส่งคืนวัตถุ HTTPSESSION ของผู้ใช้นี้ตาม ID นี้และดูแลเซสชัน
(ดังนั้นเป็นไปได้ไหมที่จะใช้เซสชันเดียวกันกับเบราว์เซอร์ที่แตกต่างกัน?
นี่คือ URL ทั่วไปซึ่งมีเอฟเฟกต์การปลอมแปลงบางอย่างและสามารถใช้เซสชันเดียวกันกับเบราว์เซอร์ที่แตกต่างกัน:
http: // localhost: 8080/day07_2/cncookieservlet; jsessionid = f8692d61cd46d094dbb7a8fc7387649c)
ความสัมพันธ์ระหว่างเบราว์เซอร์และเซิร์ฟเวอร์มีดังนี้:
httpsession:
ใน servlet วัตถุเซสชันจะได้รับผ่านวิธี httpservletrequest.getSession
วิธีการต่อไปนี้ของอินเทอร์เฟซ HTTPSESSION ใช้เพื่อแบ่งปันข้อมูลไปยังเซสชันทั่วทั้งเซสชัน:
getAttribute ("ชื่อ") setAttribute ("ชื่อ", วัตถุ);เป็นโมฆะ (); - วิธีนี้ลบเซสชันแคชเซิร์ฟเวอร์อย่างยิ่ง
ตัวอย่าง:
SetAttribute ใน httpsession ของ servlet
ไปที่ servlet อื่นผ่าน HyperConnect หรืออย่างอื่นและแสดงข้อมูลผ่าน GetAttribute
โทรหา getAttribute ใน servlet ใด ๆ เพื่อแสดงข้อมูล
ปิดเบราว์เซอร์นี้และทบทวน servlet ที่ได้รับข้อมูลและคุณจะพบว่าไม่มีข้อมูลอีกต่อไป
ดังนี้:
ชื่อสตริง = request.getParameter ("ชื่อ"); request.setAttribute ("ชื่อ", "คำขอ ---"+ชื่อ); request.getSession (). setAttribute ("ชื่อ", "เซสชัน ---"+ชื่อ); getServletContext (). setAttribute ("ชื่อ", "แอปพลิเคชัน ---"+ชื่อ); ตัวระบุที่ไม่ซ้ำกันของเซสชัน:
แต่ละเซสชันมีตัวระบุที่ไม่ซ้ำกันคือ ID
เมื่อเบราว์เซอร์ได้รับเซสชันใหม่ผู้ใช้สามารถพิมพ์ค่า ID ผ่านเซสชัน Session.geid ()
โดยไม่ต้องปิดเบราว์เซอร์กระโดดบนหลายหน้าโดยใช้เซสชันเดียวกัน
ชอบ:
request.getSession (). getId ()
ทางออกที่ปลอดภัยคืออะไร:
เมื่อผู้ใช้ออกไปเขาควรล้างข้อมูลของเขาจากเซสชัน - นั่นคือออกอย่างปลอดภัย
ทางออกที่ปลอดภัยคือการล้างข้อมูลที่คุณทิ้งไว้บนเซิร์ฟเวอร์เพื่อป้องกันไม่ให้ถูกแฮ็ก
session.invalidate ();
1. request.getSession (). unvalidate ();
สิ่งนี้จะช่วยให้วัตถุที่เกี่ยวข้องในพูลเซสชันจะถูกลบ
2. เซสชัน Removeattribute (…)
ชอบ:
request.getSession (). RemoveAttribute ("RealCode");
ใช้เพื่อลบแอตทริบิวต์ในวัตถุเซสชัน
ติดตามเซสชันโดยเขียน URL ใหม่:
ดังที่ได้กล่าวไว้ก่อนหน้านี้คอนเทนเนอร์ servlet แรกจะบันทึก SessionID บนไคลเอนต์ ต่อมาเมื่อเบราว์เซอร์ออกคำขอ HTTP จะมีเซสชันนี้ คอนเทนเนอร์ Servlet อ่าน SessionID ในคำขอ HTTP และนำวัตถุ HTTPSESSION ออกจากคอนเทนเนอร์ตาม SessionID นี้เพื่ออำนวยความสะดวกในการติดตามว่าเซสชันคำขอ HTTP เป็นของ กระบวนการนี้เรียกว่าการติดตามเซสชัน
หากเบราว์เซอร์รองรับคุกกี้คอนเทนเนอร์ Servlet จะบันทึก SessionID เป็นคุกกี้บนไคลเอนต์ของเบราว์เซอร์ แต่ถ้าผู้ใช้ปิดใช้งานคุกกี้ด้วยเหตุผลด้านความปลอดภัย Servlet คอนเทนเนอร์จะติดตามเซสชันได้อย่างไร
ก่อนอื่นมาปิดการใช้งานคุกกี้ใน IE (หมายเหตุ: มันไม่ทำงานสำหรับระบบผีบางอย่าง)
เช่นเครื่องมือ> ตัวเลือกอินเทอร์เน็ต> ความเป็นส่วนตัว> ขั้นสูงและปิดการใช้งานคุกกี้:
เราสามารถเพิ่มการเชื่อมโยงหลายมิติลงในหน้าแรก: (ฉันใส่รหัสที่เกี่ยวข้องกับ saveservlet.java getServlet.java logoutservlet.java logoutservlet.java ในรหัสต่อไปนี้)
<H2> แสดงให้เห็นถึงเทคโนโลยี URL ที่เขียนซ้ำ ---- การแคร็กปัญหาที่เซสชันของเราไม่ถูกต้องหลังจากผู้ใช้ปิดใช้งานคุกกี้ </h2> <form action = "< %= response.encodeUrl (" saveservlet ") %>" method = "โพสต์"> ชื่อ: <อินพุตประเภท = "ข้อความ" ชื่อ "ชื่อ"/> < href = "< %= response.encodeUrl (" getServlet ") %>"> rewrite url-read data ในคอนเทนเนอร์หลายตัว </a> <br/> <a href = "< %= response.encodeurl (" logoutservlet ") %>"ประโยคนี้ <form action = "<%= response.encodeUrl ("/aa ")%>"> สามารถตระหนักถึงฟังก์ชั่นนี้
หลังจากปิดการใช้งานคุกกี้ที่นี่เบราว์เซอร์ยังสามารถรับคุกกี้ที่ส่งโดยเซิร์ฟเวอร์ได้ แต่เบราว์เซอร์สามารถยอมรับได้เท่านั้นและไม่สามารถส่งไปยังเซิร์ฟเวอร์ได้ หากไม่สามารถส่งคุกกี้ได้ก็ไม่สามารถไปที่พูลเซสชันเพื่อรับวัตถุที่เกี่ยวข้อง
หลังจากป้อนค่าที่ต้องการในแบบฟอร์มให้ไปที่ไฮเปอร์ลิงก์ใน GetServlet ด้านล่างเพื่อดูว่าสามารถแสดงค่าอินพุตได้หรือไม่ คำตอบคือใช่ เส้นทางการเข้าถึงที่นี่คล้ายกัน
http: // localhost: 8080/day07_2/cncookieservlet; jsessionid = f8692d61cd46d094dbb7a8fc7387649c, jsessionid = f8692d61cd46d094dbb73fc73 ด้วยวิธีนี้คุณสามารถเข้าถึงได้โดยป้อน URL นี้ในเบราว์เซอร์อื่น
ที่นี่ฉันต้องการเพิ่ม: (สถานการณ์ต่อไปนี้คือเมื่อฉันเขียนวัตถุ HTTPSESSION ในสระว่ายน้ำค่า JSESSIONID และค่าของเซสชั่นที่เกี่ยวข้องลงในคุกกี้คุกกี้นี้จะเขียนทับสิ่งที่สร้างขึ้นโดยระบบ
ในสองกรณีว่าคุกกี้ถูกปิดใช้งานรหัสของวัตถุที่สร้างขึ้นใหม่ในพูลเซสชันนั้นแตกต่างกัน นั่นคือถ้าคุณป้อนค่าของชื่อในแบบฟอร์มเมื่อคุกกี้ถูกปิดใช้งานผลการสอบถามมีดังนี้:
และ JSessionId คือ 2BB51EBDEAAF14D19656C71E1B6F9FF6
จากนั้นเปลี่ยนไปใช้โหมดคุกกี้ทันทีโดยไม่ปิดการใช้งานให้ป้อนชื่ออื่นเช่น Tom และผลลัพธ์การสืบค้นจะเป็น Tom สองตัวและ Jsessionid เป็นธรรมชาติโดยธรรมชาติ
203F9E4DB5D874476B81DAF350661B6A ซึ่งแตกต่างจากการปิดการใช้งานซึ่งทำให้ผลลัพธ์ดังต่อไปนี้ปรากฏขึ้น
จากนั้นในเวลานี้เราปิดเบราว์เซอร์ป้อนเบราว์เซอร์อีกครั้งและดูผลลัพธ์การเข้าถึงโดยไม่ปิดใช้งานโหมดคุกกี้ดังนี้:
ฉันจะโพสต์รหัสหลักด้านล่าง:
saveservlet.java
แพ็คเกจ cn.hncu.servlets.session; นำเข้า java.io.ioException; นำเข้า java.io.printwriter; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.cookie; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; ระดับสาธารณะ Saveservlet ขยาย httpservlet {public void doget (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) โยน servletexception, ioexception {dopost (คำขอ, การตอบสนอง); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setContentType ("text/html; charset = utf-8"); PrintWriter out = response.getWriter (); request.Setcharacterencoding ("UTF-8"); ชื่อสตริง = request.getParameter ("ชื่อ"); request.setAttribute ("ชื่อ", "คำขอ ---"+ชื่อ); request.getSession (). setAttribute ("ชื่อ", "เซสชัน ---"+ชื่อ); getServletContext (). setAttribute ("ชื่อ", "แอปพลิเคชัน ---"+ชื่อ); // ตัวอย่างของการรวมเทคโนโลยีคุกกี้และเทคโนโลยีเซสชันสำหรับแอปพลิเคชัน -ฟังก์ชั่น: หลังจากปิดเบราว์เซอร์หากผู้ใช้สามารถเข้าสู่เว็บไซต์นี้ภายใน 10 นาทีเขายังสามารถเข้าถึงข้อมูลในเซสชัน // เขียนคุกกี้ด้วยคีย์ "JSessionId" คุกกี้ c = คุกกี้ใหม่ ("jsessionid", request.getSession (). getId ()); C.SetMaxage (60*10); // ปรากฏการณ์ข้างต้นเกิดจากประโยคนี้ หากไม่มีประโยคนี้จะไม่มีปรากฏการณ์ดังกล่าวดังที่ได้กล่าวไว้ข้างต้น C.SetPath (request.getContextPath ()); Response.addcookie (C); out.println ("บันทึกสำเร็จ ... "); out.flush (); out.close (); -getServlet.java
แพ็คเกจ cn.hncu.servlets.session; นำเข้า java.io.ioException; นำเข้า java.io.printwriter; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; ระดับสาธารณะ GetServlet ขยาย Httpservlet {โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setContentType ("ข้อความ/html; charset = utf-8"); PrintWriter out = response.getWriter (); out.println ("<! doctype html สาธารณะ/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<head> <title> a servlet </title> </head>"); out.println ("<body>"); string reqname = (string) request.getAttribute ("ชื่อ"); String sename = (string) request.getSession (). getAttribute ("ชื่อ"); String appName = (string) getServletContext (). getAttribute ("ชื่อ"); out.println (reqname+"<br/>"); out.println (sename+"<br/>"); out.println (appname+"<br/>"); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); -logoutservlet.java
แพ็คเกจ cn.hncu.servlets.session; นำเข้า java.io.ioException; นำเข้า java.io.printwriter; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletRequest; นำเข้า Javax.servlet.http.httpservletResponse; ระดับสาธารณะ logoutservlet ขยาย httpservlet {public void doget (httpservletrequest Request, httpservletResponse การตอบสนอง) โยน servletexception, ioexception {response.setContentType ("ข้อความ/html; charset = utf-8"); PrintWriter out = response.getWriter (); // Safe Exit --- ตราบใดที่วัตถุเซสชันนั้นไม่ถูกต้องคำขอ. getSession (). unvalidate (); out.println ("ทางออกที่ปลอดภัย ... "); -ด้านบนคือการจัดการเซสชันเซสชันของ Javaweb ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉัน บรรณาธิการจะตอบกลับคุณทันเวลา!