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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值