点击提交按钮后Servlet无法重定向问题求助
嘿,我来帮你排查下sendRedirect不生效的问题,这几个常见坑你可以逐一核对:
1. 空指针异常打断了重定向逻辑
你现在的用户名密码判断直接写了username.equals("gogikole"),如果用户没输入用户名,request.getParameter("txtusername")会返回null,这时候调用equals会直接抛出NullPointerException,导致后面的重定向代码根本没机会执行。
修复方式很简单,要么把常量放前面,要么先判空:
// 方式1:常量在前避免空指针 if("gogikole".equals(username) && "1234".equals(password)) { response.sendRedirect("mainMenu.jsp"); } // 方式2:先校验非空再判断 if(username != null && password != null && username.equals("gogikole") && password.equals("1234")) { response.sendRedirect("mainMenu.jsp"); }
2. 重定向前输出了内容导致HTTP头已发送
重定向是靠HTTP响应头的Location字段实现的,如果在sendRedirect之前,你不小心输出了任何内容(比如用response.getWriter()写了字符,或者JSP页面里<%@ page %>指令前有多余的空格、换行),会导致响应头已经被发送给浏览器,这时候sendRedirect就会失效。
检查这两个点:
- 确保LoginServlet的
doPost方法里,在sendRedirect之前没有调用response.getWriter()或response.getOutputStream()输出内容 - 检查login.jsp页面,有没有在页面最顶部的指令前出现空格、换行或者其他字符
3. 相对路径可能存在上下文路径问题
sendRedirect用的是相对路径,这个路径是相对于当前请求URL的。如果你的项目部署时有上下文路径(比如项目名是mywebapp,访问地址是http://localhost:8080/mywebapp/login.jsp),直接写mainMenu.jsp会重定向到http://localhost:8080/mywebapp/mainMenu.jsp,如果你的mainMenu.jsp不在这个位置,就会出现404,看起来像是重定向没生效。
更稳妥的写法是带上上下文路径:
response.sendRedirect(request.getContextPath() + "/mainMenu.jsp");
4. 确认是否真的进入了重定向分支
你把else部分注释掉了,万一用户名或密码输错了,代码不会执行重定向,也没有任何提示,你可能会误以为是重定向失效。建议先把else部分打开,或者加个日志,确认是否进入了重定向的代码块:
if("gogikole".equals(username) && "1234".equals(password)) { System.out.println("验证通过,准备跳转到主菜单"); response.sendRedirect(request.getContextPath() + "/mainMenu.jsp"); } else { System.out.println("用户名或密码错误"); // 也可以跳回登录页并提示错误: // response.sendRedirect("login.jsp?error=1"); }
按这几个步骤排查下来,应该就能解决你的问题了。
内容的提问来源于stack exchange,提问作者Neo Cortex

