我有这个代码login.jsp和registration.jsp 这些jsps让我登录并成功注册,数据将保存到mysql数据库中。 现在,接下来要做的就是如何更改密码。 你能帮我改变密码吗? 这是我的数据库
CREATE TABLE `members` (
`id` int(10) unsigned NOT NULL auto_increment,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`email` varchar(45) NOT NULL,
`uname` varchar(45) NOT NULL,
`pass` varchar(45) NOT NULL,
`regdate` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
的login.jsp
<%@ page import ="java.sql.*" %>
<%
String userid = request.getParameter("uname");
String pwd = request.getParameter("pass");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/users",
"root", "");
Statement st = con.createStatement();
ResultSet rs;
rs = st.executeQuery("select * from members where uname='" + userid + "' and pass='" + pwd + "'");
if (rs.next()) {
session.setAttribute("userid", userid);
//out.println("welcome " + userid);
//out.println("<a href='logout.jsp'>Log out</a>");
response.sendRedirect("success.jsp");
} else {
out.println("Invalid password <a href='index.jsp'>try again</a>");
}
%>
registration.jsp
<%@ page import ="java.sql.*" %>
<%
String user = request.getParameter("uname");
String pwd = request.getParameter("pass");
String fname = request.getParameter("fname");
String lname = request.getParameter("lname");
String email = request.getParameter("email");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/users",
"root", "");
Statement st = con.createStatement();
ResultSet rs;
int i = st.executeUpdate("insert into members(first_name, last_name, email, uname, pass, regdate) values ('" + fname + "','" + lname + "','" + email + "','" + user + "','" + pwd + "', CURDATE())");
if (i > 0) {
//session.setAttribute("userid", user);
response.sendRedirect("welcome.jsp");
// out.print("Registration Successfull!"+"<a href='index.jsp'>Go to Login</a>");
} else {
response.sendRedirect("index.jsp");
}
%>
编辑这里是我的change.jsp我不知道它是否正确。
change.jsp
<%@ page import ="java.sql.*" %>
<%
String userid = request.getParameter("uname");
String pwd = request.getParameter("pass");
String chg = request.getParameter("change");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/users",
"root", "");
Statement st = con.createStatement();
ResultSet rs;
st.executeUpdate("update members set chg='" + pwd + "' where uname='" + userid + "'");
%>
帮助我谢谢!
答案 0 :(得分:2)
您需要一个UPDATE sql来更改密码。
update members set pass=? where uname=?
请注意,您的代码目前容易受到SQL注入攻击。
在新代码中,您需要更改
st.executeUpdate("update members set chg='" + pwd + "' where uname='" + userid + "'");
到
st.executeUpdate("update members set pwd='" + pwd + "' where uname='" + userid + "'");
答案 1 :(得分:2)
您现有的方法存在许多问题,但让我们从最基本的方法开始。 存储原始用户密码是不合情理的。您应该 salt和hash他们(如果有人读取您的数据库会怎么样?)
接下来,您应不混合您的演示文稿和业务逻辑。一旦你掌握了这一点,你不应该在JSP scriptlet中这样做的事实几乎是无关紧要的。这是您通常开始了解设计模式的地方 - 我强烈建议您查看Model-view-controller,
最后,您应该使用绑定变量清理用户输入(PreparedStatement或使用StringEscapeUtils)。否则,您很容易受到SQL injection attacks的攻击。</ p>
答案 2 :(得分:-1)
你的sql不能
"update members set chg='" + pwd + "' where uname='" + userid + "'"
如果表格中的密码字段是
`pass` varchar(45) NOT NULL,
所以你的SQL应该是
"update members set pass='" + pwd + "' where uname='" + userid + "'"
关于sql注入,我认为重要的是要知道如果用户输入包含一个'的用户ID或pwd,就足以打破你的查询。
这就是为什么你更喜欢使用PreparedStatement(http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)而不是Statement