ไม่กี่วันที่ผ่านมาเมื่อฉันทำงานเกี่ยวกับระบบเช็คอินฉันพบปัญหาเซสชันยอดนิยม โครงการคือ Spring+SpringMVC+MyBatis Framework ระบบด้าน Javaweb-Side ของไดเรกทอรีการจัดการ Maven สำหรับบางประเด็นของเซสชันการวิเคราะห์ต่อไปนี้จะทำ ที่นี่เรามุ่งเน้นไปที่ปัญหาของวงจรชีวิตเซสชัน สำหรับคำจำกัดความอื่น ๆ เราจะไม่อธิบาย:
ก่อนอื่นให้อธิบายวงจรชีวิตของเซสชั่น:
ที่เก็บข้อมูล: เซสชันจะถูกเก็บไว้ในฝั่งเซิร์ฟเวอร์ โดยทั่วไปเพื่อป้องกันไม่ให้ถูกเก็บไว้ในหน่วยความจำเซิร์ฟเวอร์ (สำหรับการเข้าถึงความเร็วสูง) เซสซินนอนจะถูกสร้างขึ้นเมื่อผู้ใช้เข้าถึงเซิร์ฟเวอร์เป็นครั้งแรก มีความจำเป็นที่จะต้องทราบว่าเซสชันจะถูกสร้างขึ้นเฉพาะเมื่อเข้าถึง JSP, servlet และโปรแกรมอื่น ๆ การเข้าถึงทรัพยากรแบบคงที่เช่น HTML และ Image จะไม่สร้างเซสชัน ในแอปพลิเคชัน Javaweb คุณสามารถเรียก ร้องขอ getSession (บูลีน XXX) เพื่อสร้างเซสชัน โปรดทราบว่าเมื่อพารามิเตอร์บูลีนเป็นจริงเซสชันใหม่จะถูกบังคับให้สร้างที่นี่
1. เวลาหมดอายุครั้ง:
เซสชันจะหมดอายุหลังจากครั้งสุดท้ายที่ใช้เซสชันถึงเวลาที่ล้มเหลว
2. วิธีการอื่นในเซสชัน. invalidate () ถูกดำเนินการซึ่งทำให้เซสชันไม่ถูกต้อง
สำหรับเวลาที่ไม่ถูกต้องคุณสามารถกำหนดได้โดยการกำหนดค่าคุณสมบัติใน web.xml:
<session-config> <session-timeout> เวลาหมดอายุ </session-timeout> </ession-config>
หน่วยของเวลาล้มเหลวคือนาที หากเซสชันนั้นใช้ได้สำหรับหนึ่งวันก็สามารถตั้งค่าเป็น 60*24 เมื่อตั้งค่าเป็น 0 หรือลบเซสชันจะถูกต้องอย่างถาวร ตามคำจำกัดความของเวลาล้มเหลวมันเป็นเรื่องง่ายที่จะเข้าใจสถานการณ์นี้
เหตุใดเซสชันจึงล้มเหลวหลังจากปิดเบราว์เซอร์?
ขึ้นอยู่กับสิ่งที่เป็นที่รู้จักตัวอย่างง่ายๆถูกเขียนขึ้น:
@ControllerPublic คลาสเซสชัน {@requestmapping ("/sessiontest") สตริงสาธารณะเซสชัน Test (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) {system.out.println ("ประสบความสำเร็จ!"); httpsession session = request.getSession (); session.setMaxinactiveInterval (259200); request.setAttribute ("CreationTime", session.getCreationTime ()); // การสร้างเวลาการร้องขอ. setAttribute ("id", session.getId ()); // id request.setAttribute ("max", session.getMaxinactiveInterval (-1)); request.setAttribute ("ล่าสุด", session.getLastaccessiontime ()); // เวลาการใช้งานล่าสุด request.setAttribute ("sessiontest", เซสชัน); // system.out.println (session.getCreationTime ()); กลับ "หน้า/การแสดง"; } <table cellpacing = "0" cellpadding = "0"> <tr> <td> เวลาการสร้าง: </td> <td> $ {creationtime} </td> </tr> <tr> <td> id: </td> <td> $ {id} </td> เวลา: </td> <td> $ {max} </td> </tr> <tr> <td> ครั้งสุดท้ายที่ใช้: </td> <td> $ {ครั้งสุดท้าย} </td> </tr> <td> <td>การวิเคราะห์:
จะเห็นได้ว่าเวลาที่ไม่ถูกต้องของเซสชันนั้นจริง ๆ แล้วเมื่อเบราว์เซอร์ถูกปิดดังนั้นหากเบราว์เซอร์ไม่ปิดและเข้าถึงอีกครั้งคุณสามารถใช้สถานะการเข้าสู่ระบบต่อไปได้ เวลาที่เรากำหนดไว้ข้างต้นเป็นตัวแทนอย่างไร
เซสชันถูกสร้างขึ้นระหว่างเบราว์เซอร์และเซิร์ฟเวอร์ เนื่องจากไคลเอนต์ไม่ได้โต้ตอบกับเซิร์ฟเวอร์เป็นเวลานาน (เวลาไฮเบอร์เนต) เซิร์ฟเวอร์ทำลายเซสชันนี้ เซสชันก่อนหน้าเมื่อไคลเอนต์โต้ตอบกับเซิร์ฟเวอร์อีกครั้งไม่มีอยู่ ความเข้าใจของฉันคือเวลาที่ไม่ถูกต้องจะมีผลในระหว่างเซสชันเท่านั้น หากเบราว์เซอร์ถูกปิดและเซสชันจะสิ้นสุดเวลาที่ไม่ถูกต้องจะถูกตั้งค่าให้ถูกต้องอย่างถาวรซึ่งเป็นช่วงเวลาที่เบราว์เซอร์ปิดและปิดเซสชัน เพื่อแก้ปัญหานี้คุณสามารถผสมคุกกี้กับเซสชัน มีวิธีที่โง่เช่นนี้:
เพิ่มคุกกี้อย่างแข็งขันเพื่อตั้งค่าไดเรกทอรีบันทึกและเวลาการอยู่รอด
โมฆะคงที่สาธารณะ addcookie (ชื่อสตริง, ค่าสตริง, อายุ int, httpservletResponse การตอบสนอง) พ่น unsupportencodexception {คุกกี้ c = คุกกี้ใหม่ (ชื่อ, urlencoder.encode (ค่า, "UTF-8")); C.SetMaxage (อายุ); C.SetPath (เส้นทาง); Response.addcookie (C); - เมื่อเข้าถึงอีกครั้งให้ใช้ Cookie[] cookies = request.getCookies(); ในการสำรวจคุกกี้ให้ได้คุกกี้ที่ต้องการตามชื่อของคุกกี้หรืออาจกล่าวได้ว่าเป็นเซสชั่น ในที่สุดคุณจะได้รับผลลัพธ์ที่ต้องการและเซสชั่น (คุกกี้ชื่อ JsessionId) หนีออกมาจากการจำคุกของเบราว์เซอร์
สรุป
ด้านบนเป็นวิธีแก้ปัญหาความล้มเหลวของ J2ee-session หลังจากปิดเบราว์เซอร์ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!