Java Oracle数据库未使用jsp.It';它显示一个空白页
问题是,当我在表单中输入详细信息并输入submit时,它会显示一个空白的.jsp页面,数据库也不会更新。我已经在WEB-INF/lib文件夹中包含了odjbc.14 jar文件,并且正在使用oracle 10g。ideeclipse。代码中有什么错误 这是要连接到数据库(oracle)的页面:Java Oracle数据库未使用jsp.It';它显示一个空白页,java,eclipse,oracle,jsp,Java,Eclipse,Oracle,Jsp,问题是,当我在表单中输入详细信息并输入submit时,它会显示一个空白的.jsp页面,数据库也不会更新。我已经在WEB-INF/lib文件夹中包含了odjbc.14 jar文件,并且正在使用oracle 10g。ideeclipse。代码中有什么错误 这是要连接到数据库(oracle)的页面: =1){ out.println(“保存”); } 否则{ out.println(“未保存”); } } 捕获(SQLE异常){ e、 printStackTrace(); } %> 代码>空白页的问
=1){
out.println(“保存”);
}
否则{
out.println(“未保存”);
}
}
捕获(SQLE异常){
e、 printStackTrace();
}
%>
<>代码>空白页的问题是SQL是无效的,抛出SQLExpRebug。您的代码将在catch
块中结束,并将错误打印到应用程序服务器日志中,而不是打印到您的页面中。在您的示例中,有几件事情您可以做得更好,如下所述:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" import="java.sql.*,java.security.*" %>
<!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>Test</title>
</head>
<body>
<%
String user = request.getParameter("login_id");
String pwd = request.getParameter("password");
String fname = request.getParameter("first_name");
String lname = request.getParameter("last_name");
String email = request.getParameter("email");
String sql = "INSERT INTO MEMBERS(FIRST_NAME, LAST_NAME, EMAIL, USER_ID, PASSWORD, REG_DATE)"
+ " VALUES(?, ?, ?, ?, ?, SYSDATE)";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager
.getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, fname);
stmt.setString(2, lname);
stmt.setString(3, email);
stmt.setString(4, user);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(pwd.getBytes("UTF-8"));
byte[] digest = md.digest();
stmt.setString(5, new String(digest, "UTF-8"));
int action = stmt.executeUpdate();
if (action >= 1) {
con.commit();
out.println("saved");
} else {
out.println("not saved");
}
} catch (SQLException e) {
e.printStackTrace();
out.println("Error saving your details:<br/>");
out.println(e.getMessage());
}
%>
</body>
</html>
输入以下代码后,您将开始在页面上看到错误消息,并将其打印到app server日志中:
} catch (SQLException e) {
e.printStackTrace();
out.println("Error saving your details:<br/>");
out.println(e.getMessage());
}
现在我得到了预期的结果:saved
注意:SYSDATE
是一个关键字,因此不需要任何()
。但还有更多
3.提交数据:如另一个答案中所述,您不一定提交数据。它可以正常工作,因为AutoCommit的默认值为true
,也可以在第一次调用页面后正常工作,因为您已将AutoCommit设置为true
,但在这两种情况下,您都可能会有一些非常糟糕的副作用,可能会变得难以调试。确保数据安全的最佳方法是通过更改
int action=con.createStatement().executeUpdate(sql);
con.setAutoCommit(true);
if(action>=1){
out.println("saved");
}
要执行实际的提交,并且仅当我还执行了插入时:
con.setAutoCommit(false);
int action = con.createStatement().executeUpdate(sql);
if (action >= 1) {
con.commit();
out.println("saved");
} else {
out.println("not saved");
}
这可能会给您一个无法提交,而自动提交设置为on
,就像在我的系统上一样,因为自动提交默认设置为true
。因此,我通过添加一个额外的行来显式地取消激活它:
con.setAutoCommit(false);
4.防止和降低性能:您所能做的最糟糕的事情之一就是将值直接连接到SQL语句中!这对Oracle的性能来说是非常糟糕的,因为数据库总是需要硬解析您的语句并使用更多的CPU来解析语句,但对安全性来说更糟糕,因为现在有人可以将实际的SQL语句放在一个值中。解决方法是使用绑定变量:
String sql = "INSERT INTO MEMBERS(FIRST_NAME, LAST_NAME, EMAIL, USER_ID, PASSWORD, REG_DATE)"
+ " VALUES(?, ?, ?, ?, ?, SYSDATE)";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager
.getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, fname);
stmt.setString(2, lname);
stmt.setString(3, email);
stmt.setString(4, user);
stmt.setString(5, pwd);
int action = stmt.executeUpdate();
if (action >= 1) {
con.commit();
out.println("saved");
} else {
out.println("not saved");
}
5.混淆密码:这是另一个安全问题。以明文形式存储密码是不好的,确实非常糟糕。您不需要知道您的用户密码,DBA也不应该只需在您的表上执行一个简单的SELECT
,就可以获得密码。Unix或存储管理员也不应该通过将其从数据文件中灰显出来,网络管理员也不应该看到它以明文形式在网络上飞行。理想情况下,您可以尽快加密密码,在这种情况下,我将对其应用简单的SHA-256哈希。然后在登录页面上,我将确保再次将密码转换为SHA-256哈希,并比较哈希而不是明文密码:
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(pwd.getBytes("UTF-8"));
byte[] digest = md.digest();
stmt.setString(5, new String(digest, "UTF-8"));
int action = stmt.executeUpdate();
您是否遇到过任何异常或错误?“代码中有什么错误?”SQL注入。@对于Oracle,它不使用sysdate而使用curdate
con.setAutoCommit(false);
String sql = "INSERT INTO MEMBERS(FIRST_NAME, LAST_NAME, EMAIL, USER_ID, PASSWORD, REG_DATE)"
+ " VALUES(?, ?, ?, ?, ?, SYSDATE)";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager
.getConnection("jdbc:oracle:thin:nishtha/FirstJ2ee@//localhost:1521/XE");
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, fname);
stmt.setString(2, lname);
stmt.setString(3, email);
stmt.setString(4, user);
stmt.setString(5, pwd);
int action = stmt.executeUpdate();
if (action >= 1) {
con.commit();
out.println("saved");
} else {
out.println("not saved");
}
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(pwd.getBytes("UTF-8"));
byte[] digest = md.digest();
stmt.setString(5, new String(digest, "UTF-8"));
int action = stmt.executeUpdate();