RequestDispatcher forward失效排查:登录验证后无法跳转页面
问题原因及修复方案
1. AJAX请求导致服务器跳转不生效(核心问题)
你使用AJAX异步请求Servlet,而RequestDispatcher.forward()是服务器内部跳转——它只会把ok.jsp的内容作为AJAX请求的响应返回给浏览器,不会触发浏览器的页面跳转。AJAX的设计初衷是在不刷新页面的情况下获取数据,这种场景下用AJAX不符合你的页面跳转需求。
修复方式:
方案一:改用普通表单提交(推荐)
直接去掉AJAX逻辑,用原生表单提交:
<form action="login" method="post"> <input type="text" id="userName" name="userName"> <button type="submit">登录</button> </form>
提交后,服务器的forward会直接控制浏览器完成页面跳转。
方案二:保留AJAX,手动触发跳转
如果坚持用AJAX,需要Servlet返回登录结果,再在前端回调里手动跳转:
- Servlet修改(返回JSON结果,不要forward):
// 验证成功时返回JSON res.setContentType("application/json"); PrintWriter out = res.getWriter(); out.write("{\"success\": true, \"username\": \"" + sUsername + "\"}"); out.flush(); - AJAX添加回调逻辑:
$.ajax({ type: "POST", url: "login", data: JSON.stringify(myData), dataType: "json", success: function(response) { if (response.success) { // 手动跳转至ok.jsp,通过URL参数传递用户名 window.location.href = "ok.jsp?username=" + response.username; } else { // 跳转错误页面 window.location.href = "error.jsp"; } }, error: function() { window.location.href = "error.jsp"; } }); - 修改
ok.jsp,从URL参数获取用户名:<% String sID = request.getParameter("username"); %>
2. Servlet代码中的语法错误
你的Servlet存在编译错误,导致逻辑无法正常执行:
- try/catch块语法不完整:
catch(Exception e)块缺少闭合大括号,且while循环未加大括号(虽然逻辑上不影响,但代码可读性差)。修复后:try{ BufferedReader reader = req.getReader(); while ((inLine = reader.readLine()) != null) { sbuffer.append(inLine); } if (sbuffer.length() != 0){ JSONObject jsObj = new JSONObject(sbuffer.toString()); sUsername = jsObj.optString("userName"); } }catch(Exception e){ e.printStackTrace(); // 不要直接return,打印异常便于排查问题 return; } iHitCnt未定义:代码中int iCnt = iHitCnt++;的iHitCnt没有声明,会导致编译错误,可删除该行或定义为类的静态变量。- Content-Type设置冲突:你设置了
res.setContentType("application/json");,但后续要forward到返回HTML的JSP,会导致响应头和实际内容不一致,若用方案一的表单提交,需删除这行设置。
3. JSP优化点
LoginOK.jsp中session = request.getSession(true);无需手动赋值,JSP默认内置session对象,可直接使用。- 字符编码建议统一改为UTF-8,避免乱码问题,替换所有
big5为UTF-8。
内容的提问来源于stack exchange,提问作者stockton
相关产品推荐
相关产品推荐

