public UserBean authenticate(String username,String password){
PostGresDAO pg=new PostGresDAO(); //creates new connection
Connection conn=pg.getConnecion(); //return connection object
PreparedStatement ps;
ResultSet rs;
String query="select password,name from scg_users where username=?";
UserBean ub=null;
boolean authenticated=false;
try{
ps=conn.prepareStatement(query);
ps.setString(1, username);
rs=ps.executeQuery();
if(rs!=null){
authenticated=password.equals(rs.getString(1)); //exception raised here
if(authenticated){
ub=new UserBean();
ub.setUser(rs.getString(2));
ub.setUsername(username);
}
}
}
catch(SQLException e){
e.printStackTrace();
}
return ub;
}
我正在使用此代码验证用户身份。用户名和密码从请求参数中提取并传递给此方法进行身份验证。但它抛出了一个:
org.postgresql.util.PSQLException: ResultSet not positioned properly, perhaps you need to call next.
请建议。
答案 0 :(得分:15)
错误告诉你完全出了什么问题 - 你没有在ResultSet上调用next()
来到达结果的第一行。
这一行:
if(rs!=null)
据我所知,毫无意义;我不相信executeQuery
会返回null。如果查询中存在问题,则会引发异常。如果没有结果,则返回空结果集。要查看是否有一行,您应该调用next()
并检查返回值:
if (rs.next())
此外:
答案 1 :(得分:2)
因为即使我在next()
上致电resultSet
我收到了消息,我也会告诉我的解决方案。
解决方案是,如果resultSet.get*
为空,则不要致电resultSet
。所以请检查if(resultSet.next()){ ...
答案 2 :(得分:1)
而不是
if(rs!=null)
您需要检查
if(rs.next())
如果有任何匹配的行,这将返回第一行。