Java 为什么会有Postgres例外?
下午好。我尝试从eclipse的java代码连接到数据库。我需要提出请求,并检查表单中键入的用户名和密码是否匹配。用户名及其密码列表位于名为stud_test的数据库中。我需要运行gradle和tomcat来检查servlet是否工作。当我这样做并打开所需页面时,我会看到PSQL异常。下面是我的代码示例。我不明白出了什么问题Java 为什么会有Postgres例外?,java,postgresql,tomcat,servlets,jdbc,Java,Postgresql,Tomcat,Servlets,Jdbc,下午好。我尝试从eclipse的java代码连接到数据库。我需要提出请求,并检查表单中键入的用户名和密码是否匹配。用户名及其密码列表位于名为stud_test的数据库中。我需要运行gradle和tomcat来检查servlet是否工作。当我这样做并打开所需页面时,我会看到PSQL异常。下面是我的代码示例。我不明白出了什么问题 public void doPost(HttpServletRequest request, HttpServletResponse response)
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException {
Connection con;
ResultSet rs;
String URL = "jdbc:postgresql://localhost:5432/stud_test";
String username = request.getParameter("useruser");
String passwrd = request.getParameter("pass");
response.setContentType("text/html");
try {
con = DriverManager.getConnection(URL, "postgres", "postgres");
Statement st = con.createStatement();
st.executeQuery ("SELECT password FROM stud WHERE user = " + username);
rs = st.getResultSet();
if (passwrd.equals(rs)){
request.getServletContext().getRequestDispatcher(
"/jsp/hello.jsp").forward(request, response);
}
else {
request.getServletContext().getRequestDispatcher("/jsp/fail.jsp").forward(request, response);
}
rs.close ();
st.close ();
}
catch(Exception e) {
System.out.println("Exception is :" + e);
}
}
我想你应该
if (passwrd.equals(rs.getString(1))){ ... }
假设用户字段是数据库中的varchar
您不能将字符串(passwrd)与结果集实例(rs)匹配。我认为您应该
if (passwrd.equals(rs.getString(1))){ ... }
假设用户字段是数据库中的varchar
您无法将字符串(passwrd)与ResultSet实例(rs)进行匹配。除了Sergiu已经提到的内容外,下面的行不太可能实现您想要的功能:
st.executeQuery ("SELECT password FROM stud WHERE user = " + username);
例如,如果用户名是“carl”,则将向数据库发送以下语句:
SELECT password FROM stud WHERE user = carl
如果没有名为“carl”的列,则会导致语法错误。解决这个问题的“显而易见”(也是错误的方法!)是使用
st.executeQuery ("SELECT password FROM stud WHERE user = '" + username + "'");
这可能(一开始)起作用,但会使您容易受到SQL注入的影响。请求信息的正确方法是使用和参数:
final PreparedStatement stm = connection.prepareStatement(
"SELECT password FROM stud WHERE user = ?");
try {
// For each "hole" ("?" symbol) in the SQL statement, you have to provide a
// value before the query can be executed. The holes are numbered from left to
// right, starting with the left-most one being 1. There are a lot of "setXxx"
// methods in the prepared statement interface, and which one you need to use
// depends on the type of the actual parameter value. In this case, we assign a
// string parameter:
stm.setString(1, username);
final ResultSet rs = stm.executeQuery();
try {
if (rs.next()) {
if (password.equals(rs.getString(1))) {
// Yay. Passwords match. User may log in
}
}
} finally {
rs.close();
}
} finally {
stm.close();
}
是的,在Java中通过JDBC与数据库通信需要大量的样板代码。不,“显而易见”的解决方案是错误的!错了!错了 除了Sergiu已经提到的,下面这句话不太可能实现您的愿望:
st.executeQuery ("SELECT password FROM stud WHERE user = " + username);
例如,如果用户名是“carl”,则将向数据库发送以下语句:
SELECT password FROM stud WHERE user = carl
如果没有名为“carl”的列,则会导致语法错误。解决这个问题的“显而易见”(也是错误的方法!)是使用
st.executeQuery ("SELECT password FROM stud WHERE user = '" + username + "'");
这可能(一开始)起作用,但会使您容易受到SQL注入的影响。请求信息的正确方法是使用和参数:
final PreparedStatement stm = connection.prepareStatement(
"SELECT password FROM stud WHERE user = ?");
try {
// For each "hole" ("?" symbol) in the SQL statement, you have to provide a
// value before the query can be executed. The holes are numbered from left to
// right, starting with the left-most one being 1. There are a lot of "setXxx"
// methods in the prepared statement interface, and which one you need to use
// depends on the type of the actual parameter value. In this case, we assign a
// string parameter:
stm.setString(1, username);
final ResultSet rs = stm.executeQuery();
try {
if (rs.next()) {
if (password.equals(rs.getString(1))) {
// Yay. Passwords match. User may log in
}
}
} finally {
rs.close();
}
} finally {
stm.close();
}
是的,在Java中通过JDBC与数据库通信需要大量的样板代码。不,“显而易见”的解决方案是错误的!错了!错了 你得到了什么异常?请发布错误堆栈跟踪。异常非常方便。它将告诉您发生异常的代码行,并经常提供有关异常发生原因的有用信息。因此,在catch处理程序中,请执行
e.printStackTrace()
,研究输出,如果我们也能看到,我们可能会提供帮助。您会遇到什么异常?请发布错误堆栈跟踪。异常非常方便。它将告诉您发生异常的代码行,并经常提供有关异常发生原因的有用信息。因此,在catch处理程序中,请执行e.printStackTrace()
,研究输出,如果我们也能看到,我们可能会提供帮助。