เมื่อเร็ว ๆ นี้ฉันกำลังเขียนเว็บไซต์ซื้อหนังสือ เมื่อทดสอบฟังก์ชั่นการออกจากระบบคลิกเบราว์เซอร์เพื่อกลับไปรีเฟรชเบราว์เซอร์คุณจะพบว่าผู้ใช้ที่ออกจากระบบได้ออกจากระบบแล้ว
หลังจากคิดมาเป็นเวลานานฉันได้พบโซลูชั่นออนไลน์มากมาย แต่วิธีการที่ให้ทางออนไลน์ส่วนใหญ่คือการใช้ JS เพื่อออกจากระบบและห้ามมิให้ผู้ใช้คลิกที่เบราว์เซอร์เพื่อส่งคืน
แม้ว่าวิธีนี้จะเป็นไปได้ แต่ก็ไม่ได้แก้ปัญหานี้ในพื้นหลัง รู้สึกเหมือนได้รับการปกป้องจากสุภาพบุรุษ แต่ไม่ใช่คนร้าย
ต่อไปนี้เป็นวิธีที่คุณนำไปใช้
หลักการ:
หลังจากเข้าสู่ระบบแล้วคลิกที่เบราว์เซอร์เพื่อกลับไปรีเฟรชเบราว์เซอร์ ในความเป็นจริงเบราว์เซอร์จะส่งข้อมูลของแบบฟอร์มเดิมอีกครั้ง
ออกจากระบบหมายถึงการฆ่าเซสชันดั้งเดิม
// ออกจากระบบโมฆะส่วนตัวออกจากระบบ (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {httpsession session = request.getSession (); request.setAttribute ("SessionId", session.getId ()); Session.RemoveAttribute ("ผู้ใช้"); session.invalidate (); Response.sendredirect (request.getContextPath () + "/index.jsp"); - เมื่อเปลี่ยนเส้นทางไปยังหน้า JSP หลังจากเข้าสู่ระบบเซสชันที่สร้างขึ้นจะแตกต่างจากเซสชันดั้งเดิม (เซสชันของหน้า JSP เปิดใช้งานโดยค่าเริ่มต้น)
กล่าวคือหลังจากเข้าสู่ระบบคลิกเบราว์เซอร์เพื่อกลับไปรีเฟรชเซสชันเป็นเซสชันใหม่ จากมุมมองนี้ลองคิดเกี่ยวกับการแก้ปัญหา
ฉันใส่ข้อมูลชิ้นหนึ่งในเซสชันดั้งเดิม ฉันสามารถรับข้อมูลนี้เป็นครั้งแรกเมื่อฉันเข้าสู่ระบบหลังจากเข้าสู่ระบบเซสชันดั้งเดิมจะหายไป คลิกที่เบราว์เซอร์เพื่อกลับไปรีเฟรช ไม่มีข้อมูลในเซสชันใหม่ ค่าที่ได้รับเป็นโมฆะ
จับคู่ข้อมูลในเซสชันดั้งเดิมด้วยค่าเซสชันใหม่ หนึ่งมีค่าและอื่น ๆ เป็นโมฆะ การจับคู่จะล้มเหลวอย่างแน่นอน ในเวลานี้คุณสามารถให้พรอมต์ที่ใช้งานง่ายและให้ผู้ใช้เข้าสู่ระบบอีกครั้ง
ดังนั้นข้อมูลในเซสชันดั้งเดิมจะถูกบันทึกได้อย่างไรหลังจากเข้าสู่ระบบ (หากเซสชันดั้งเดิมถูกยกเลิกมันจะหายไป) พิจารณาเพิ่มโดเมนที่ซ่อนอยู่ในแบบฟอร์มและวางข้อมูลในเซสชันดั้งเดิมในโดเมนที่ซ่อนอยู่ หลังจากเข้าสู่ระบบแล้วคลิกเบราว์เซอร์เพื่อกลับไปรีเฟรช เบราว์เซอร์จะส่งข้อมูลโดยอัตโนมัติในเซสชันดั้งเดิมโดยไม่ต้องบันทึกด้วยตนเองด้วยตนเอง (อันที่จริงแล้วการบันทึกด้วยตนเองอาจต้องวางไว้ในบริบทแอปพลิเคชัน ServletContext และฉันไม่เคยลองเลย)
คล้ายกับการแก้ปัญหาการส่งแบบฟอร์มซ้ำ ๆ แต่ข้อมูลในเซสชันดั้งเดิมไม่สามารถกำจัดได้ที่นี่เนื่องจากเซสชันเดียวกันไม่ใช่เซสชันเดียวกันก่อนและหลังออกจากระบบ
รายละเอียดมีดังนี้: ใน login.jsp
<%สตริงโทเค็น = new Random (). nextLong ()+""; session.setAttribute ("โทเค็น", โทเค็น);%> <form action = "$ {pageContext.Request.ContextPath}/servlet/clientServlet? name = "name"> </td> </tr> <tr> <td align = "ขวา"> รหัสผ่าน: </td> <td> <อินพุต type = "รหัสผ่าน" ชื่อ = "รหัสผ่าน"> </td> </tr> <td> <td> </td> <td> name = "token" value = "$ {sessionscope.token}"> </form> ใน servlet ให้พรอมต์ที่เป็นมิตรและเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบ
httpsession session = request.getSession (); // แก้ปัญหาของการเข้าสู่ระบบซ้ำของเบราว์เซอร์หลังจากออกจากระบบ // ให้ฟิลด์อินพุตที่ซ่อนอยู่และรับค่าของโดเมนที่ซ่อนอยู่ในพื้นหลัง // รีเฟรชเบราว์เซอร์หลังจากเข้าสู่ระบบจะสร้างเซสชันใหม่ สตริง hiddentoken = request.getParameter ("โทเค็น"); if (! hiddentoken.equals (SessionToken)) {request.setAttribute ("ข้อความ", "คุณได้ออกจากระบบโปรดลงชื่อเข้าใช้อีกครั้งและหันไปที่หน้าเข้าสู่ระบบหลังจาก 2 วินาที <meta http-equiv = 'รีเฟรช' เนื้อหา = 2; url =" request.getRequestDispatcher ("/client/message.jsp"). forward (คำขอ, การตอบกลับ); กลับ; - ทดสอบ:
เข้าสู่ระบบ
หลังจากเข้าสู่ระบบแล้วคลิกที่เบราว์เซอร์เพื่อกลับไปรีเฟรช เบราว์เซอร์จะแจ้งให้ทราบว่าจะส่งข้อมูลใหม่หรือไม่
คลิกเพื่อส่งกลับ
สิ่งนี้ช่วยแก้ปัญหาการคลิกเบราว์เซอร์เพื่อกลับไปรีเฟรชผู้ใช้และเข้าสู่ระบบอีกครั้งหลังจากเข้าสู่ระบบ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น