通过 JSP 和 Servlet 创建更改密码页面



我使用JSP创建了一个Change Password表单,以及一个servlet页面来操作数据并将其输入到DB中。这是一个内部网站(内联网),因此DB已经为所有用户包含了关于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 {
}}

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

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

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

最新更新