Bạn có thể và không nên tắt nút quay lại hoặc lịch sử của trình duyệt. Điều đó không tốt cho trải nghiệm người dùng. Có các bản hack JavaScript, nhưng chúng không đáng tin cậy và cũng sẽ không hoạt động khi máy khách đã tắt JS.
Vấn đề cụ thể của bạn là trang được yêu cầu được tải từ bộ nhớ cache của trình duyệt thay vì trực tiếp từ máy chủ. Điều này về cơ bản là vô hại, nhưng thực sự gây nhầm lẫn cho người dùng cuối, bởi vì họ nghĩ sai rằng nó thực sự đến từ máy chủ.
Bạn chỉ cần hướng dẫn trình duyệt không lưu vào bộ nhớ cache tất cả các trang JSP bị hạn chế (và do đó không chỉ trang đăng xuất / hành động!). Bằng cách này, trình duyệt buộc phải yêu cầu trang từ máy chủ thay vì từ bộ đệm và do đó tất cả các kiểm tra đăng nhập trên máy chủ sẽ được thực hiện. Bạn có thể thực hiện việc này bằng Bộ lọc đặt các tiêu đề phản hồi cần thiết trong doFilter()
phương thức:
@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);
}
// ...
}
Ví dụ: ánh xạ điều này Filter
trên một url-pattern
mối quan tâm *.jsp
.
@WebFilter("*.jsp")
Hoặc nếu bạn chỉ muốn đặt hạn chế này trên các trang được bảo mật, thì bạn nên chỉ định mẫu URL bao gồm tất cả các trang được bảo mật đó. Ví dụ: khi tất cả chúng đều nằm trong thư mục /app
, thì bạn cần chỉ định mẫu URL của /app/*
.
@WebFilter("/app/*")
Thậm chí, bạn có thể thực hiện công việc này giống Filter
như khi bạn đang kiểm tra sự hiện diện của người dùng đã đăng nhập.
Đừng quên xóa bộ nhớ cache của trình duyệt trước khi thử nghiệm! ;)
Xem thêm: