分析前面实现登录、注册、注销和修改密码的不足,如何解决?
提示,主要问题如下:
1. 相应Servlet类中数据库参数代码重复,后期更新麻烦。
解决思路:相关参数存于Web.xml中:
<1>模块中代码
ServletContext ctx=this.getServletContext();
String server=ctx.getInitParameter("server");
String dbname=ctx.getInitParameter("dbname");
String user=ctx.getInitParameter("user");
String pwd=ctx.getInitParameter("pwd");
<2>web.xml代码
<context-param>
<param-name>server</param-name>
<param-value>localhost</param-value>
</context-param>
<context-param>
<param-name>dbname</param-name>
<param-value>dh</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>pwd</param-name>
<param-value>1234</param-value>
</context-param>
2. 登录有漏洞,不安全
用SQL注入方式登录测验,即在任意密码后加上: ‘ or ‘1’=’1
3. JDBC连接数据库代码重复,执行效率低
4. SQL语句复杂
解决问题234可考虑将相关操作封装到一个类中实现
1. 在原项目中定义类DBOper
2. 在相应模块(登录、注册、注销和修改密码)的Servlet中 完成
(1) 实例化DBOper对象
(2) 实现数据库连接
(3) 重新定义SQL语句
(4) 执行SQL语句(注意实参和形参的对应),根据执行结果向客户做出响应。
DBOper db=new DBOper();
try {
// 获得数据库连接
// 注册驱动
db.getConn(server, dbname, user, pwd);
//注意问号的使用
String sql="SELECT * FROM userdetail WHERE username=? AND userpass=?";
ResultSet rs=db.executeQuery(sql, new String[]{username,userpass});
//out.println(rs);com.mysql.jdbc.JDBC4ResultSet@68db2015 @后面的是数据库结果的首地址,每次执行程序都会改变!
//out.println(rs.next());
if(rs!=null && rs.next()) {//next()很强大,能够判断出这个结果首地址是否有效,切记!!
//out.println(rs);
out.println("登录成功!!");
}
else out.println("登录失败!!");
}catch(Exception e) {
e.printStackTrace();
}
3.在DBOper中,主要代码及其功能有:
(1)定义数据库连接函数,在函数中设置URL,并且注册驱动、连接数据库
(2)定义释放资源函数
(3)重写executeQuery()和executeUpdate()函数,
public ResultSet executeQuery(String preparedSql,String[] param) {
/*处理sql,执行sql
得到PreparedStatement对象*/
try {
//System.out.println(preparedSql);SELECT * FROM userdetail WHERE username=? AND userpass=?
pstmt=conn.prepareStatement(preparedSql);
//System.out.println(pstmt);com.mysql.jdbc.JDBC4PreparedStatement@5ec78633: SELECT * FROM userdetail WHERE username=** NOT SPECIFIED ** AND userpass=** NOT SPECIFIED **
if(pstmt!=null){
for(int i=0;i<param.length;i++) {
pstmt.setString(i+1,param[i]);
//System.out.println(param[i]);zy 55411
}
}
//System.out.println(pstmt);com.mysql.jdbc.JDBC4PreparedStatement@5ec78633: SELECT * FROM userdetail WHERE username='zy' AND userpass='55411'
rs=pstmt.executeQuery();
//System.out.println(rs);//com.mysql.jdbc.JDBC4ResultSet@174d3a24
}catch(SQLException e) {
e.printStackTrace();
}
return rs;
}