Невозможно получить значение из базы данных Oracle с помощью JSP, получая java.sql.SQLException: результат устанавливается после последней строки - PullRequest
0 голосов
/ 14 января 2019

Я написал простую программу jsp, в которой я пытаюсь получить имя пользователя и пароль из базы данных, вот моя программа jsp.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import ="java.sql.*" %>
<%@ page import ="oracle.sql.*" %>
<%@ page import ="oracle.jdbc.driver.*" %>
<%@page import="oracle.jdbc.driver.OracleDriver"%>
<%@ page import ="java.util.Date" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String driver="oracle.jdbc.driver.OracleDriver";
String userid = request.getParameter("username"); 
String pwd=request.getParameter("password"); 

Connection con = null;




%>
<%try
{
Class.forName("oracle.jdbc.driver.OracleDriver");

con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:CCB25", "CISADM", "CISADM");
Statement st= con.createStatement();
String query="select * from CMLOGIN where USERID='"+userid+"'";
ResultSet rs=st.executeQuery(query); 
String pass1="";
rs.next();


pass1 = rs.getString("password");

if(pass1.equals(pwd))
{ 
%>
<%String name=request.getParameter("username");
session.setAttribute("nam",name);%> 
<jsp:forward page="admin.jsp"></jsp:forward>
<%}
else
{
String msg="Username or password failed";%>
<center> <p style="font-family:verdana;color:red;"><%=msg %>
<jsp:include page="Login.jsp"></jsp:include>

<%}
}
catch(Exception e)
{
e.printStackTrace();
}
%>

</body>

и у меня есть javax.servlet.jar и ojdbc7-12.1.0.2.jar в папке web-inf / lib. Я получаю java.sql.SQLException: результат установлен после последней строки в следующей строке "pass1 = rs.getString (" password ");" Не могли бы вы подсказать мне, что я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вот это же немного убрано. Вы должны будете добавить обратно в обработку исключений и закрытие соединения / оператора / набора результатов

  • Надеюсь, вам никогда не придется использовать этот код по-настоящему, так как он берет пароль из строки запроса в открытом виде, а затем сравнивает с чистой версией в БД.
  • Сравнение паролей перенесено в сам sql.
  • Всегда используйте PreparedStatements, чтобы избежать SQL-инъекций

Комментарии в коде.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import ="java.sql.*" %>
<%@ page import ="java.util.Date" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String userid   = request.getParameter("username"); 
String pwd      = request.getParameter("password"); 

Connection con       = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/XE", "klrice", "klrice");

//
// USE BINDS ! to avoid sql injection
// push the userid and passwd comparison to the db 
// no need to get the password and compare locally
// 
String query         = "select password from cmlogin where userid=? and password=?";

PreparedStatement st = con.prepareStatement(query);

// 
//  Binds in the vaules
// 

st.setString(1,userid);
st.setString(2,pwd);

ResultSet rs         = st.executeQuery(); 

String pass1;

//  .next will advance if the query has any results
// 

if ( rs.next() ) {
            pass1 = rs.getString("password");
      String name =request.getParameter("username");
      session.setAttribute("nam",name);
%> 
    <jsp:forward page="admin.jsp"></jsp:forward>
<%
    } else {
        String msg="Username or password failed";
%>
        <center> <p style="font-family:verdana;color:red;"> <%=msg %>
        <jsp:include page="Login.jsp"></jsp:include>
<%  }  %>
</body>
0 голосов
/ 14 января 2019

Сначала нужно проверить, есть ли в ResultSet какие-либо строки, прежде чем вызывать .next(), чтобы предотвратить это исключение.

Используйте это:

if (rs.next){
  //read next row
}

, если вы хотите перебрать все строки ResultSet, используйте цикл while:

while(rs.next){
  //do something for every row
}
...