Servlet登录验证输入正确用户名仍提示登录失败问题排查
问题核心原因
- 代码中判断字符串相等使用了
==运算符,这是Java中典型的字符串比较误区:==对比的是两个字符串对象的内存地址,而非字符串的实际内容。req.getParameter("username")返回的字符串是运行时生成的新对象,和常量池中的"abc"内存地址不一致,所以判断永远返回false。 - 同时存在两处笔误:成功日志拼写错误为
LOG IN SCUCCESSFUL(正确应为SUCCESSFUL),失败日志拼写错误为LOG IN FAILD(正确应为FAILED)。 - 额外的冗余代码:
String.valueOf(req.getParameter("username"))没有必要,req.getParameter本身返回值就是String类型,若参数为空时调用String.valueOf反而会把null转为"null"字符串,增加逻辑异常风险。
修复方案
将字符串判断逻辑替换为equals()方法,equals()才是用于对比字符串实际内容的方法,为了避免用户名取空时的空指针异常,推荐将常量"abc"放在前面调用equals方法:
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/login") public class Servlet1 extends HttpServlet{ // 推荐重写doPost方法单独处理POST请求,不要直接覆写service,避免破坏Servlet默认的请求分发逻辑 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { String userName = req.getParameter("username"); String password = req.getParameter("pswd"); System.out.println(userName); if("abc".equals(userName)) { System.out.println("LOG IN SUCCESSFUL"); } else { System.out.println("LOG IN FAILED"); } } }
内容的提问来源于stack exchange,提问作者V V ARJUN
相关产品推荐
相关产品推荐

