You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:48:03