Pelacakan sesi kedaluwarsa di browser

Jadi, ada aplikasi web heterogen yang kompleks, dengan bagian AJAX dilakukan secara manual dan dengan kerangka kerja, beberapa jendela pop-up, dll. Klien besar yang terhormat mendekati Anda dengan persyaratan untuk membatalkan, menutup, atau melakukan aktivitas lain di semua web jendela aplikasi setelah sesi HTTP habis. Mudah-mudahan Anda tahu cara mengontrol interval waktu habis sesi HTTP, untuk aplikasi web yang sesuai dengan J2EE, ini dilakukan dari file web.xml (namun di banyak server aplikasi, hal itu dilakukan tidak dengan cara standar). Untuk time-out 10 menit adalah:

  10  

Persyaratan klien sama sekali tidak absurd dan sangat masuk akal dari sudut pandang pengguna akhir, tetapi ini bisa menjadi masalah yang sangat menyakitkan bagi pengembang karena: 1. Anda tidak bisa memulai penghitung waktu mundur di jendela browser setiap kali halaman dimuat untuk menutup jendela setelah batas waktu. Pendekatan ini bekerja di dunia non-AJAX ketika setiap interaksi browser-server mengakibatkan jendela browser dimuat ulang. 2. Anda tidak dapat meminta server untuk memeriksa apakah sesi HTTP telah habis waktunya atau tidak, karena setiap kueri tersebut akan diperlakukan sebagai interaksi browser-server yang memperpanjang sesi. Ini akan mengarah pada sesi yang tidak pernah berakhir. 3. Anda bisa membuat aplikasi web terpisah yang menyadari sesi HTTP aplikasi web utama dan berpotongan dengannya. Tapi itu berlebihan,dan kemungkinan solusi tersebut diterima sangat rendah karena masalah integrasi mungkin muncul. 4. Anda dapat mencoba mencegat semua interaksi browser-server AJAX dengan beberapa kode seperti peretasan tingkat lanjut, dan ini akan membantu Anda untuk menangani jendela Anda saat ini. Tetapi ini tidak berfungsi untuk beberapa kasus jendela yang terbuka - Anda tidak bisa berkomunikasi antar jendela browser. Satu-satunya cara untuk berbicara dengan beberapa jendela yang terbuka dari jendela utama adalah dengan menggunakan referensi JavaScript jendela lain, dan setelah jendela utama dimuat ulang atau diarahkan ke lokasi lain, semua referensi JavaScript ke jendela lain akan hilang. 5. Pendekatan yang paling realistis adalah membuat permintaan XMLHTTP JavaScript berkala (dari setiap jendela yang terbuka) ke server setiap {session max inactive interval} +10 detik. Ini akhirnya akan menutup semua jendela,tetapi dapat mengakibatkan jendela ditutup menit (atau bahkan berjam-jam tergantung pada setelan waktu habis sesi aplikasi web) setelah sesi HTTP dimusnahkan, misalnya setelah pengguna keluar dari dalam jendela utama. Tidak ada lagi pilihan yang tersisa, Anda frustrasi dan Anda berpikir bahwa inilah saat yang tepat untuk mengambil pistol ayah Anda dan menembak teman sekelas Anda di sekolah besok. Tidak, belum nak - masih ada jalan keluar! Jalan keluarnya tidak terlalu mudah, tetapi sangat elegan. Cookies akan membantu kami. Orang dapat berpikir bahwa waktu kedaluwarsa cookie akan melakukan triknya. Sayangnya, seperti yang dijelaskan diIni adalah waktu yang tepat untuk mengambil pistol ayahmu dan menembak teman sekelasmu di sekolah besok. Tidak, belum nak - masih ada jalan keluar! Jalan keluarnya tidak terlalu mudah, tetapi sangat elegan. Cookies akan membantu kami. Orang dapat berpikir bahwa waktu kedaluwarsa cookie akan melakukan triknya. Sayangnya, seperti yang dijelaskan diIni adalah waktu yang tepat untuk mengambil pistol ayahmu dan menembak teman sekelasmu di sekolah besok. Tidak, belum nak - masih ada jalan keluar! Jalan keluarnya tidak terlalu mudah, tetapi sangat elegan. Cookies akan membantu kami. Orang dapat berpikir bahwa waktu kedaluwarsa cookie akan melakukan triknya. Sayangnya, seperti yang dijelaskan di

ini

Artikel, Anda tidak dapat mengandalkan waktu kedaluwarsa cookie karena diukur oleh browser klien, dan tidak ada yang dapat menjamin bahwa jam sistem klien tidak terlambat satu tahun. Jadi, inilah Sistem dan Metode untuk Melacak Time-Out Sesi HTTP dalam aplikasi Web heterogen. Pada setiap permintaan yang dibuat dari browser ke server, dua cookie disetel oleh filter servlet. Satu memegang waktu server saat ini, dan yang lain memegang waktu berakhirnya sesi. Waktu server saat ini hanya diperlukan untuk menghitung offset antara klien dan server. Waktu kedaluwarsa sesi kemudian diperiksa secara berkala terhadap waktu server _calculated_ saat ini (ingat offsetnya). Setiap kali permintaan _any_ dibuat ke server, cookie waktu kedaluwarsa diperbarui, dan semuanya berfungsi. Dalam praktiknya, metode ini diwujudkan hanya dalam tiga langkah: 1.Buat filter servlet yang akan memfilter setiap permintaan ke aplikasi web Anda. Konfigurasikan di web.xml seperti ini:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter   SessionTimeoutCookieFilter /*  

Jangan khawatir tentang kinerja aplikasi web Anda - filter ini SANGAT primitif, yang dilakukannya hanyalah menambahkan dua cookie ke respons:

 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) req; long currTime = System.currentTimeMillis(); long expiryTime = currTime + session.getMaxInactiveInterval() * 1000; Cookie cookie = new Cookie("serverTime", "" + currTime); cookie.setPath("/"); httpResp.addCookie(cookie); if (httpReq.getRemoteUser() != null) { cookie = new Cookie("sessionExpiry", "" + expiryTime); } else { cookie = new Cookie("sessionExpiry", "" + currTime); } cookie.setPath("/"); httpResponse.addCookie(cookie); filterChain.doFilter(req, resp); } 

Menetapkan jalur (ke "/" dalam kasus kami) sangat penting. Jika Anda menghilangkan pengaturan jalur, browser akan secara otomatis menghitungnya dari URL yang akan mengakibatkan kekacauan di dalam penyimpanan cookie browser Anda. 2. Kami membutuhkan JavaScript kecil di setiap jendela untuk menghitung offset antara waktu server dan klien. Ini perlu dijalankan hanya sekali, tetapi tidak ada salahnya untuk menjalankannya pada setiap pemuatan halaman:

 function calcOffset() { var serverTime = getCookie('serverTime'); serverTime = serverTime==null ? null : Math.abs(serverTime); var clientTimeOffset = (new Date()).getTime() - serverTime; setCookie('clientTimeOffset', clientTimeOffset); } window.onLoad = function() { calcOffset(); }; 

3. Dan akhirnya kita membutuhkan fungsi yang akan benar-benar memeriksa apakah sesi telah waktunya habis. Ini perlu dijalankan secara berkala, dalam kasus kami setiap 10 detik (atau 10.000 milidetik):

 function checkSession() { var sessionExpiry = Math.abs(getCookie('sessionExpiry')); var timeOffset = Math.abs(getCookie('clientTimeOffset')); var localTime = (new Date()).getTime(); if (localTime - timeOffset > (sessionExpiry+15000)) { // 15 extra seconds to make sure window.close(); } else { setTimeout('checkSession()', 10000); } } 

Memang, menutup jendela browser setelah sesi berakhir adalah kebrutalan murni, dan itu dapat dan harus disertai dengan pesan peringatan yang muncul seperti 1 menit sebelum waktu sesi habis. Saya sangat tertarik untuk menerima

umpan balik kritis

pada metode saya.

Artikel ini, "Kedaluwarsa sesi pelacakan di browser", awalnya diterbitkan oleh JavaWorld.