Anda dapat dan tidak boleh menonaktifkan tombol kembali atau riwayat browser. Itu buruk untuk pengalaman pengguna. Ada peretasan JavaScript, tetapi tidak dapat diandalkan dan juga tidak akan berfungsi jika JS klien dinonaktifkan.
Masalah konkret Anda adalah bahwa halaman yang diminta dimuat dari cache browser, bukan langsung dari server. Ini pada dasarnya tidak berbahaya, tetapi memang membingungkan bagi pengguna akhir, karena ia salah mengira bahwa ini benar-benar berasal dari server.
Anda hanya perlu menginstruksikan browser untuk tidak menyimpan semua halaman JSP yang dibatasi (dan dengan demikian tidak hanya halaman / tindakan logout itu sendiri!). Dengan cara ini browser dipaksa untuk meminta halaman dari server, bukan dari cache dan karenanya semua pemeriksaan login di server akan dijalankan. Anda dapat melakukan ini menggunakan Filter yang menyetel header respons yang diperlukan dalam doFilter()
metode:
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);
}
// ...
}
Petakan ini Filter
di tempat yang url-pattern
diminati, misalnya *.jsp
.
@WebFilter("*.jsp")
Atau jika Anda ingin menempatkan batasan ini pada halaman aman saja, maka Anda harus menentukan pola URL yang mencakup semua halaman aman tersebut. Misalnya, jika semuanya ada di folder /app
, maka Anda perlu menentukan pola URL /app/*
.
@WebFilter("/app/*")
Terlebih lagi, Anda dapat melakukan pekerjaan ini sama Filter
seperti saat Anda memeriksa keberadaan pengguna yang masuk.
Jangan lupa untuk membersihkan cache browser sebelum menguji! ;)
Lihat juga: