用JSP/Servlet开发简单的用户注册系统
作者:板桥banq
上页
2.3.5 密码数据操作类
建立Password数据模型类主要是为了封装有关数据表password的操作,包括password数据表的新增、修改和查询。代码如下:
public class Password {
//用户Id
private String userid = null;
//原有密码
private String password = null;
//新密码
private String newpassword = null;
//新密码校验
private String newpassword2 = null;
//新的邮件地址
private String email = null;
public void setUserid(String userid) { this.userid = userid; }
public String getUserid() { return userid; }
public void setPassword(String password) { this.password = password; }
public String getPassword() { return password; }
… //其他属性的setXXX和getXXXX方法
// 修改password表
public int update() throws Exception {
if (!isValid())
return Constants.FORM_ERROR;
String sql = "update password set password=PASSWORD(?)
where userid=? and password=PASSWORD(?)";
String assitsql =
"update passwordassit set passwdtype=?,passwdanswer=?,oldpassword =?
where userid=?";
Mysql mysql = new Mysql(sql);
try {
mysql.setString(1, newpassword);
mysql.setString(2, userid);
mysql.setString(3, password);
mysql.executeUpdate();
mysql.prepareStatement(assitsql);
mysql.setInt(1, passwdtype);
mysql.setString(2, passwdanswer);
mysql.setString(3, newpassword);
mysql.setString(4, userid);
mysql.executeUpdate();
} catch (Exception ex) {
throw new Exception("Password.update()" + ex.getMessage());
} finally {
mysql.close();
}
return Constants.OK;
}
//查询passwordassit表
public boolean selectassit() throws Exception {
boolean valid = false;
String sql = "select * from passwordassit where userid= ?";
Mysql mysql = new Mysql(sql);
try {
mysql.setString(1, userid);
ResultSet rs = mysql.executeQuery();
if (rs != null && rs.next()) {
passwdtype = rs.getInt("passwdtype");
passwdanswer = rs.getString("passwdanswer");
valid = true;
}
} catch (Exception ex) {
throw new Exception("Password.selectassit()" + ex.getMessage());
} finally {
mysql.close();
}
return valid;
}
// 获得丢失的密码
public boolean getMypassword() throws Exception {
boolean valid = false;
ResultSet rs = null;
if (passwdanswer == null || passwdanswer.equals("") || passwdtype == 0)
return valid;
String sql =
"select * from passwordassit where userid=? and passwdtype = ? ";
Mysql mysql = new Mysql(sql);
try {
mysql.setString(1, userid);
mysql.setInt(2, passwdtype);
rs = mysql.executeQuery();
if (rs != null && rs.next()) {
//如果密码提示回答与数据库吻合
if (rs.getString("passwdanswer").equals(passwdanswer)) {
password = rs.getString("oldpassword");
valid = true;
}
}
} catch (Exception ex) {
throw new Exception("Password.getMypassword()" + ex.getMessage());
} finally {
mysql.close();
}
return valid;
}
}
这是一个数据库操作类,在该Password类中主要实现了有关用户密码的一系列操作,相对来说比较简单。
2.3.6 登录验证功能
登录验证功能是用户注册系统的核心功能,主要是将用户输入的用户名和密码与数据库中保存的用户名和密码进行核对检查,如果一致就认为该用户为合法注册用户。
一般用户第一次登录都要输入登录信息,一旦登录验证通过后,系统应该一直保留该用户信息,直至该用户退出系统。保存用户注册信息有很多方式,将注册信息保存在HttpSession中是一种方式,这里以2.2.2节讨论到的方案来实现。在登录JSP页面中加入登陆JavaBean的调用,代码如下:
<jsp:useBean id="signIn" scope="session" class="com.jdon.simpleregister.SignIn"/>
一旦第一次验证通过,SignIn 这个Bean将一直在内存存在,直至用户退出或Session失效。在SignIn中将实现用户输入的登录信息和数据库保存信息进行校验,如果校验成功,就设置一个标志,表示验证通过了,这样不必每次都进行数据库操作。
public class SignIn {
private final static String sql =
"SELECT userid,password FROM password WHERE userid=? AND
password = PASSWORD(?)";
//验证标志,如果验证通过,本标志设定为true
private Boolean auth = false;
private String action = null;
private String userid = null;
private String password = null;
//检查本用户是否已经进行过登录验证
public Boolean isAuth(){ return auth; }
public String getAction() { return action; }
public void setAction(String action) { this.action = action; }
public String getUserid() { return userid; }
public void setUserid(String userid) { this.userid = userid; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public oolean validate() {
if (userid == null || userid.length() <= 0)
return false;
if (password == null || password.length() <= 0)
return false;
return true;
}
public oolean SignIn() {
if (auth) return auth; //如果该用户已经验证,就直接返回
Mysql mysql = new Mysql(sql);
try {
mysql.setString(1, userid);
mysql.setString(2, password);
ResultSet rs = mysql.executeQuery();
if (rs.next()) { auth = true; }
} catch (Exception e) {
System.err.println(e);
} finally {
mysql.close();
}
return auth;
}
}
由于SignIn实例将在调用的JSP中以Session形式生存,这样同一个用户多次访问的是同一个SignIn实例。如果这个用户之前已经实现了验证,那么设置isAuth为真,这样通过isAuth标志可以避免该用户反复查询数据库进行验证。SignIn实例将存在于每个需要受保护的JSP页面中。
下页