【问题标题】:Validation for user, email and password doesn't works验证用户、电子邮件和密码不起作用
【发布时间】:2014-12-23 09:43:36
【问题描述】:

我在验证电子邮件和密码时遇到问题,无论它是否属于注册会员。我正在使用 NetBeans,并使用表 members 创建了一个数据库。我已经建立了连接池并填写了我的成员表。

在实现了代码、解决了错误并观看了一些有关 NetBeans 教程的视频之后,我仍然无法弄清楚我在哪里错过了它。我被困在那里 4 天了,现在有点迷路了。希望大家能帮帮我,先谢谢了。

这是我的成员表数据:

 # | id |       email     | password |  name
------------------------------------------------
 1 |  1 | what@what.com   |   what   | Number 1 
 2 |  2 | fireup@fire.com |   fire   | Number 2

这是我的 LoginServlet 的代码:

@WebServlet("/login")
public class LoginServlet extends HttpServlet{
    @Resource(name = "jdbc/jed")
    private DataSource dsMembers;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String strName = request.getParameter("memberName");
        String strPassword = request.getParameter("memberPassword");
        String strEmail = request.getParameter("memberEmail");
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = dsMembers.getConnection();
            String sql = "SELECT * FROM members";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

            while (rs.next()){
                if((isValidEmail(strEmail))&& (strEmail.equals(rs.getString("email")))&& (strPassword.equals(rs.getString("password")))&&(strName.equals(rs.getString("name")))){
                    System.out.println("Success");

                   HttpSession session = request.getSession();
                    session.setAttribute("name", strName);
                    session.setAttribute("email", strEmail);
                    response.sendRedirect(this.getServletContext().getContextPath() + "/account.jsp");
                }
                else {
                    request.getSession().invalidate();
                    response.sendRedirect(this.getServletContext().getContextPath());
                }
            }
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
        }
    }

    private boolean isValidEmail(String strEmail){
        if(strEmail.matches("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$"))
            return true;
        return false;
    }
}

这是我得到的 GlassFish Server 日志:

信息:WEB0671:在 [/Project] 处加载应用程序 [Project]
信息:项目在 286 毫秒内成功部署。
信息:WEB0671:在 [/Project]
加载应用程序 [Project] 信息:项目在 247 毫秒内成功部署。
信息:无效的用户、密码或电子邮件
信息:无效的用户、密码或电子邮件
警告:StandardWrapperValve [org.jedlibrary.lola.loan.ValidationServlet]:PWC1406:Servlet org.jedlibrary.lola.loan.ValidationServlet 的 Servlet.service() 抛出异常 java.lang.IllegalStateException 在 org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)
在 org.jedlibrary.lola.loan.ValidationServlet.doPost(ValidationServlet.java:46) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:688) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
在 com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
在 com.sun.grizzly.ContextTask.run(ContextTask.java:71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

标签: java database validation jakarta-ee servlets


【解决方案1】:

当然不行,你在检查输入是不是邮箱是email,密码是password,名字是name

您应该检查ResultSet 项目,而不是常量。因此,例如,而不是

strEmail.equals("email")

你应该写

strEmail.equals(rs.getString("email"))

编辑:

你漏掉了一些东西:你没有检查整个ResultSet。第一个结果与您提供的数据不匹配,因此您立即使会话无效。只有当没有任何项目匹配时,您才应该使其无效。

这将解决您的问题:

while (rs.next()) {
    if (isValidEmail(strEmail) && strEmail.equals(rs.getString("email")) && strPassword.equals(rs.getString("password")) && strName.equals(rs.getString("name"))) {
        System.out.println("Success");
        HttpSession session = request.getSession();
        session.setAttribute("name", strName);
        session.setAttribute("email", strEmail);
        response.sendRedirect(this.getServletContext().getContextPath() + "/account.jsp");
        return;
    }
}
request.getSession().invalidate();
response.sendRedirect(this.getServletContext().getContextPath());

我的最后一点:你应该永远以这种方式实现登录(即使是家庭作业),选择整个表,只记录一个记录只是浪费资源.

您应该使用PreparedStatementselect * from members where name = ? 之类的语句,并检查是否有结果以及密码和电子邮件是否正确(我在这里假设该名称在数据库中是唯一的)。

【讨论】:

  • 哇,感谢您的指出,meskobalazs,但如果您不介意,我应该将其更改为或删除什么,需要帮助。
  • 感谢 meskobalazs,我刚刚更改了它,但仍然得到相同的错误日志。
  • 是的,日志来自 GlassFish Server 标签
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 2016-02-11
  • 2017-06-05
相关资源
最近更新 更多