JSP登录重登后session用户名未更新 需刷新才显示新账号问题求助
问题根因及解决方案
1. 登录逻辑代码顺序错误
你当前登录处理逻辑中,将session赋值写在了页面跳转之后,forward方法执行后服务端会直接完成请求转发,后续的setAttribute代码完全不会运行,本质上session的存值逻辑一直没有正常生效,第一次能显示用户名属于偶然情况。
修正登录判断的代码顺序,先存session再跳转:
if(match_result == true){ // 先给session赋值 request.getSession().setAttribute("username",username); // 再执行跳转 getServletContext().getRequestDispatcher("/dashboard.jsp").forward(request, response); }else{ out.print("Sorry, username or password error!"); request.getRequestDispatcher("/login.jsp").forward(request, response); }
2. 浏览器缓存导致页面未拉取最新数据
默认情况下浏览器会缓存静态/动态页面内容,你第二次登录后直接读取了之前缓存的欢迎页,所以显示的还是旧用户名,手动刷新后才会请求服务端拉取最新数据。
在dashboard.jsp的最顶部添加禁止缓存的响应头即可解决:
<% response.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires", 0); %> <!-- 以下是你原来的页面代码 --> <!DOCTYPE html> <html> ...
3. 退出登录未清理旧session
你当前的退出按钮直接跳转到登录页,没有销毁之前的session,旧的用户名数据会一直留在session中。
新增logout.jsp处理退出逻辑:
<% // 销毁当前用户的全部session数据 request.getSession().invalidate(); // 重定向到登录页 response.sendRedirect("login.jsp"); %>
然后把dashboard.jsp中退出按钮的href属性改为logout.jsp即可:
<a href="logout.jsp">Log Out</a>
额外优化建议
你当前的SQL查询采用字符串直接拼接的方式,存在严重的SQL注入风险,恶意用户可以通过输入特殊字符绕过登录校验甚至篡改数据库数据,建议改用PreparedStatement进行参数化查询。
内容的提问来源于stack exchange,提问作者user17055546
相关产品推荐
相关产品推荐

