Beberapa hari yang lalu, ketika saya sedang mengerjakan sistem check-in, saya mengalami masalah sesi yang populer. Proyek ini adalah Spring+SpringMVC+MyBatis Framework, sistem Javaweb-side dari direktori manajemen Maven. Untuk beberapa masalah sesi, analisis berikut dibuat. Di sini, kami fokus pada masalah siklus hidup sesi. Adapun definisi lain, kami tidak akan menjelaskan:
Pertama, mari kita jelaskan siklus hidup sesi ini:
Penyimpanan: Sesi disimpan di sisi server. Secara umum, untuk mencegahnya disimpan di memori server (untuk akses berkecepatan tinggi), Sessinon dibuat ketika pengguna mengakses server untuk pertama kalinya. Penting untuk dicatat bahwa sesi akan dibuat hanya saat mengakses JSP, Servlet, dan program lainnya. Hanya mengakses sumber daya statis seperti HTML dan gambar tidak akan membuat sesi. Dalam aplikasi Javaweb, Anda dapat menelepon permintaan.getSession (boolean xxx) untuk menghasilkan sesi. Perhatikan bahwa ketika parameter Boolean benar, sesi baru dipaksa untuk dihasilkan di sini.
1. Waktu kedaluwarsa sesesi:
Sesi berakhir setelah terakhir kali sesi digunakan mencapai waktu kegagalan yang ditetapkan.
2. Metode lain sesi. Invalidate () dieksekusi, yang secara aktif membuat sesi tidak valid.
Untuk waktu pembatalan, Anda dapat mendefinisikannya dengan mengonfigurasi properti di web.xml:
<session-config> <sesi-timeout> Waktu kedaluwarsa </session-timeout> </sesi-config>
Unit waktu kegagalan adalah menit. Jika sesi ini berlaku untuk satu hari, itu dapat diatur ke 60*24. Saat diatur ke 0 atau negatif, sesi ini valid secara permanen. Menurut definisi waktu kegagalan, mudah untuk memahami situasi ini.
Mengapa sesi gagal setelah browser ditutup?
Berdasarkan apa yang diketahui, contoh sederhana ditulis:
@ControllerPublic kelas sessionTest {@RequestMapping ("/sessionTest") Public String sessionTest (permintaan httpservletRequest, respons httpservletResponse) {System.out.println ("Success!"); Httpsession sesi = request.getSession (); session.setmaxinactiveInterval (259200); request.setAttribute ("CreationTime", session.getCreationTime ()); // creation time request.setAttribute ("id", session.getId ()); // id request.setAttribute ("max", session.getmaxinactiveIval (-1)); // maksimum waktu kegagalan // di sini, prioritas maxIffal (-1); Secome request.setAttribute ("LastTime", session.getLastAccessedtime ()); // permintaan waktu penggunaan terakhir.setAttribute ("sessionTest", session); // system.out.println (session.getCreationTime ()); // System.out.println (session.getMaxinactiveInttime () ()); System.out.println (session.getMaxinActiveIntIflICTIME ());/System.println (session.getMaxinActiveIctiveCess (); mengembalikan "halaman/showession"; } <Table CellPacing = "0" cellPadding = "0"> <tr> <td> Waktu penciptaan: </td> <td> $ {CreationTime} </td> </tr> <tr> <td> </tr> </td> <td> $ {id} </td> </tr> </td> <td> $ {id} </td> </tr> </td> <td> Waktu: </td> <td> $ {max} </td> </tr> <tr> <td> Terakhir kali digunakan: </td> <td> $ {terakhir} </td> </tr> <t/td> </tr> <t/td> <td> $ {sessiontest} </td> </td> </td>Analisa:
Dapat dilihat bahwa waktu pembatalan sesi sebenarnya ketika browser ditutup, jadi hanya jika browser tidak ditutup dan akses lagi Anda dapat terus menggunakan status login. Apa waktu pembatalan yang kami tetapkan di atas?
Sesi dibuat antara browser dan server. Karena klien tidak berinteraksi dengan server untuk waktu yang lama (waktu hibernasi), server menghancurkan sesi ini. Sesi sebelumnya ketika klien berinteraksi dengan server lagi tidak ada. Pemahaman saya adalah bahwa waktu pembatalan hanya berlaku selama sesi. Jika browser ditutup dan sesi berakhir, waktu pembatalan diatur ke valid secara permanen, yang merupakan momen ketika browser ditutup dan sesi ditutup. Untuk mengatasi masalah ini, Anda dapat mencampur cookie dengan sesi. Ada cara bodoh:
Secara aktif menambahkan cookie untuk mengatur direktori simpan dan waktu bertahan hidup
public static void addCookie (nama string, nilai string, usia int, httpservletResponse response) melempar UnsupportedencodingException {cookie c = cookie baru (nama, urlencoder.encode (nilai, "UTF-8")); c.setmaxage (usia); c.setpath (jalur); response.addcookie (c); } Saat mengakses lagi, gunakan Cookie[] cookies = request.getCookies(); Untuk melintasi cookie, dapatkan cookie yang diinginkan sesuai dengan nama cookie, atau bisa dikatakan sebagai sesi. Akhirnya, Anda mendapatkan hasil yang diinginkan, dan sesi (cookie bernama JSessionID) melarikan diri dari penjara browser.
Meringkaskan
Di atas adalah solusi untuk masalah kegagalan sesi J2EE setelah browser ditutup. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!