Servlet登出后浏览器回退仍可访问页面的问题求助
解决Servlet登出后浏览器回退仍能访问页面的问题
问题原因
登出后点击浏览器回退显示的是本地缓存的页面,并没有向服务器发起新请求,因此你添加的会话验证代码不会被执行,导致看起来还能访问之前的受保护页面。
解决方案
1. 禁用页面缓存(核心解决方法)
在所有需要登录才能访问的JSP和Servlet中添加响应头,强制浏览器不缓存页面。这样回退时会重新向服务器发起请求,触发会话验证逻辑。
JSP页面配置:
在JSP的页面指令后添加以下代码:<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% // 禁用缓存的响应头 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); // 设置过期时间为0,立即过期 %>Servlet配置:
在Servlet的doGet/doPost方法开头添加缓存控制代码:protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先设置缓存控制 response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); // 原有业务逻辑 String action = request.getParameter("action"); if ("logout".equals(action)) { HttpSession session = request.getSession(); session.invalidate(); response.sendRedirect("loginpage.jsp"); } }
2. 优化登出逻辑(增强严谨性)
登出时除了销毁会话,还可以清除存储会话ID的Cookie,避免残留的会话信息导致异常:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("logout".equals(action)) { // 获取现有会话(不创建新会话) HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } // 清除JSESSIONID Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("JSESSIONID".equals(cookie.getName())) { cookie.setMaxAge(0); // 立即失效 cookie.setPath(request.getContextPath()); // 匹配项目路径 response.addCookie(cookie); break; } } } response.sendRedirect("loginpage.jsp"); } }
3. 前端辅助验证(可选补充)
在页面加载时通过AJAX主动验证会话状态,若失效则自动跳转登录页:
<script> window.addEventListener('load', function() { // 调用会话验证接口 fetch('checkSession') .then(res => { if (res.status === 401) { window.location.href = 'login-form.jsp'; } }) .catch(() => { window.location.href = 'login-form.jsp'; }); }); </script>
对应的checkSession Servlet逻辑:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session == null || session.getAttribute("name") == null) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回未授权状态 } else { response.setStatus(HttpServletResponse.SC_OK); } }
内容的提问来源于stack exchange,提问作者MUHAMAD ZAINUL SHAHMY ZAINI
相关产品推荐
相关产品推荐

