【问题标题】:Create Change Password page by JSP & Servlet通过 JSP 和 Servlet 创建更改密码页面
【发布时间】:2012-11-26 10:34:17
【问题描述】:

我使用 JSP 创建了一个Change Password 表单,以及一个用于操作数据并将其输入数据库的 servlet 页面。 这是一个内部网站(内联网),因此数据库已经包含所有用户的Email, FName, LName 的详细信息。只有密码字段为空。我要做的是,在用户填写他们的电子邮件地址、密码、确认并按下提交按钮后,servlet 页面应该更新当前电子邮件的密码字段。不幸的是,在所有情况下,用户似乎都被重定向到ChangeError.jsp。 请找到随附的两个文件。(ChangePassword.JSPChangePassword.Servlet)。任何帮助将不胜感激。

    //ChangePassword.jsp
    <FORM ACTION="ChangePassword" METHOD="GET">
<div id="login_box">
  <div id="login_header">
        Login
  </div>
  <div id="form_val">
    <div class="label">Email:</div>
    <div class="control"><input type="text" name="Email" id="Email"/></div>

    <div class="label">Password:</div>
    <div class="control"><input type="password" name="Password" id="Password"/></div>

    <div class="label">Confirm Password:</div>
    <div class="control"><input type="password" name="Password" id="Password"/></div>
    <div style="clear:both;height:0px;"></div>

    <div id="msgbox"></div>
  </div>

  <div id="login_footer">
  <!-- <script type="text/javascript">
  function closewindow() {
  window.close()
  }
  </script>-->
     <label>
    <input type="submit" onclick="location.href='http://localhost:8080/IntegrateAll/Index.jsp'" window.close();" name="Submit" id="Submit" value="Submit" class="send_button" />
    </label>
  </div>
</div>

    //ChangePassword.servlet        
    import java.io.IOException;
    import javax.servlet.*;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.PreparedStatement;
    import javax.naming.*;
    public class ChangePassword extends HttpServlet {
private static final long serialVersionUID = 1L;
public ChangePassword() {
    super();
}
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String Email = request.getParameter("Email");
    String Password = request.getParameter("Password");
    String CPassword = request.getParameter("Password");

    Connection con =   GetConnectToDb();
    boolean flag = CheckLogin(Password,CPassword,Email,con);
    if(flag==true){
        gotoPage("/LoginPage.jsp",request,response);
    }
    else{
        gotoPage("/ChangeError.jsp",request,response);
    }
}
public void gotoPage(String address, HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address);
    dispatcher.forward(request, response);
}
public boolean CheckLogin(String Password, String CPassword,String Email, Connection con) {
    if (Password != null && CPassword != null && Email !=null) {
        try {
            PreparedStatement ps = con.prepareStatement("UPDATE PUBLIC.IAUSERS SET Password = ('"+Password+"') WHERE Email='"+Email+"'");
            ResultSet rs = ps.executeQuery();
        while(rs.next()) {
                return true;
            }
        } catch (Exception e) {
        }
    }
    return false;
}
public Connection GetConnectToDb() {

    try {
        InitialContext ctx = new InitialContext();
        Connection con = null;
        DataSource ds = (DataSource) ctx.lookup("java:/DefaultDS");
        con = ds.getConnection();
        return con;
    } catch (Exception e) {
        return null;
    }
}
protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    }}

【问题讨论】:

  • CheckLogin 有 3 种可能的方式返回 false:第一种 if 条件为 false,rs.next() 为 false,或抛出异常。添加日志记录或显示这些可能性的消息会使问题更容易被发现。

标签: jsp servlets


【解决方案1】:

更新查询必须使用executeUpdate() 执行,而不是executeQuery()

您的代码中还有其他问题:

  • 您应该使用准备好的语句而不是串联。这将避免 SQL 注入攻击,并避免密码包含单引号等错误。
  • 您不应该使用 GET 来发布包含密码的表单。这使得密码在浏览器地址栏中以明文形式显示
  • 您应该尊重 Java 命名约定:方法和变量以小写字母开头
  • 您应该始终在 finally 块中关闭连接。否则,在 N 次执行后,您的连接池将不再有任何可用连接,您必须每分钟重新启动应用程序
  • 永远不要捕获异常,也永远不要完全忽略异常。
  • if (flag == true) 很丑。使用if (flag)
  • 给定的 HTML 页面不应该有两个具有相同 id 属性的元素。 ID 应该是唯一的。
  • 您根本没有使用 CPassword 参数。
  • 默认情况下,这些方法应该是私有的,除非您有充分的理由将它们公开。

【讨论】:

  • 您好 JB,感谢您的回复。我试图将 excecuteQuery() 更改为 excecuteUpdate() 但我收到一个错误,说 rs 必须是一个 int。我知道缺少某些东西,但是因为我是 JAVA 新手,所以我不知道如何解决它。您能否帮助我处理 SERVLET 文件,我做错了什么或我的代码中缺少什么?如果您附上代码示例,我将不胜感激。关于所有其他更改,我会修复它。
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 2013-02-06
  • 1970-01-01
  • 2014-06-23
  • 2011-08-04
  • 2016-06-28
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多