实现B/S结构的用户登录、注册、注销和修改密码(2)

分析前面实现登录、注册、注销和修改密码的不足如何解决

提示,主要问题如下:

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代码


    server
    localhost
 

 
    dbname
    dh
 

 
    user
    root
 

 
    pwd
    1234
 

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 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;
}


你可能感兴趣的:(html)