2

Change PasswordJSP を使用してフォームを作成し、データを操作して DB に入力するサーブレット ページを作成しました。これは内部 Web サイト (イントラネット) であるため、DB にはEmail, FName, LNameすべてのユーザーに関する詳細が既に含まれています。パスワード フィールドのみが null です。私がやろうとしているのは、ユーザーが電子メールアドレスとパスワードを入力し、それを確認してから送信ボタンを押した後、サーブレットページが現在の電子メールのパスワードフィールドを更新することです。残念ながら、すべての場合において、ユーザーは にリダイレクトされるよう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 {

    }}
4

1 に答える 1

4

executeUpdate()更新クエリは、ではなく、を使用して実行する必要がありますexecuteQuery()

コードには他にも問題があります。

  • 連結ではなく、プリペアドステートメントを使用する必要があります。これにより、SQLインジェクション攻撃が回避され、たとえば、パスワードに一重引用符が含まれている場合のエラーが回避されます。
  • パスワードを含むフォームを投稿するためにGETを使用しないでください。これにより、パスワードがブラウザのアドレスバーにクリアテキストで表示されます
  • Javaの命名規則を尊重する必要があります。メソッドと変数は小文字で始まります
  • 常にfinallyブロックで接続を閉じる必要があります。そうしないと、N回実行すると、接続プールに使用可能な接続がなくなり、1分ごとにアプリケーションを再起動する必要があります。
  • 例外をキャッチしたり、例外を完全に無視したりしないでください。
  • if (flag == true)醜いです。使用するif (flag)
  • id特定のHTMLページに、同じ属性を持つ2つの要素を含めることはできません。IDは一意であると想定されています。
  • CPasswordパラメーターはまったく使用しません。
  • メソッドをパブリックにする非常に正当な理由がない限り、メソッドはデフォルトでプライベートにする必要があります。
于 2012-12-08T11:05:02.420 に答える