我有一个 Java 登录应用程序,可以运行并使用 Microsoft Access 数据库来验证登录详细信息。我目前正在构建一个 java web 应用程序,我只是尝试实现我的工作示例中的代码。
我的问题是,我这里有 2 个用户名和密码输入字段(称为“名称”和“密码”),但是在前面的示例中工作的 SQL 代码无法检测到此页面上称为名称和密码的字段,其中用户将分别输入他们的详细信息。
任何帮助将不胜感激!
<%@page import="javax.swing.JOptionPane"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Angels & Demons</title>
<a href="index.jsp">Home Page</a>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1><center>Login</center></h1>
<center><form action="login.jsp">
<h2>Please make sure to fill all fields! </h2>
<table>
<tr><td>User:<input name="name" type="text" size="10"></td></tr>
<tr><td>Password:<input name="password" size="10"></td></tr>
<td><input type="submit" value="Submit"></input></td>
</table>
</center>
<%
if ((request.getParameter("name") != null )
&& (request.getParameter("password") != null )
)
{
Connection conn = null;
Statement st = null;
ResultSet rs;
try{
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(driver);
String db = "jdbc:odbc:AngelsAndDemons";
conn = DriverManager.getConnection(db);
st = conn.createStatement();
String sql = "select user,pass from AngelsAndDemons where user = '"+name+"'and pass = '"+password+"'";
rs = st.executeQuery(sql);
int count = 0;
while(rs.next())
{
count = count + 1;
}
if(count == 1)
{
JOptionPane.showMessageDialog(null,"User found, Access Granted!");
}
else if(count > 1){
JOptionPane.showMessageDialog(null,"Duplicte User, Access Denied");
}
else{
JOptionPane.showMessageDialog(null,"User not found");
}
}
catch(Exception ex)
{
}
}
%>
There was Problem in Login.
<%
%>
}
</form>
</body>
</html>
您的代码中有两个问题..
1)你希望你的java代码在按钮单击时执行..所以你应该检查按钮单击,然后在其中编写代码:
<input type="submit" value="Submit" name="bt"></input></td> //Define a name for button
<%
if(request.getParameter("bt")!=null)
{
if ((request.getParameter("name") != null )
&& (request.getParameter("password") != null ))
{
//your code
}
}
%>
2)您尚未将用户名和密码存储在任何变量中,并且仍在查询中使用错误的文本字段名称来访问它们。将它们保存在变量中并在查询中使用该变量:
String name= request.getParameter("name");
String pass= request.getParameter("password");
String sql = "select user,pass from AngelsAndDemons where user = '"+name+"'and pass = '"+pass+"'";
请勿连接
String
。使用 PreparedStatement
来避免 SQL 注入。
还要避免将密码存储在
String
变量上。尽可能使用 char[]
,并在使用后将其擦除,以避免在内存中留下明文密码。
恭喜您尝试 Web 服务器开发。
首先是修正版本。
<%@page contentType="text/html" pageEncoding="UTF-8"
import="java.sql.*"
import="javax.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Angels & Demons</title>
<a href="index.jsp">Home Page</a>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1><center>Login</center></h1>
<%
String name = request.getParameter("name");
String password = request.getParameter("password");
if (name == null || password == null) {
%>
<center>
<form action="login.jsp" method="POST">
<h2>Please make sure to fill all fields! </h2>
<table>
<tr><td>User:<input name="name" type="text" size="10"></td></tr>
<tr><td>Password:<input name="password" size="10"></td></tr>
<td><input type="submit" value="Submit"></input></td>
</table>
</center>
</form>
<%
} else {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(driver);
String db = "jdbc:odbc:AngelsAndDemons";
try (Connection conn = DriverManager.getConnection(db)) {
String sql = "select count(*) from AngelsAndDemons where user = ? and pass = ?";
try (PreparedStatement st = conn.prepareStatement(sql)) {
st.setString(1, user);
st.setString(2, password);
try (ResultSet rs = st.executeQuery()) {
int count = 0;
if (rs.next()) {
count = rs.getInt(1);
}
if(count == 1) {
%><h2>User found, Access Granted!</2><&
} else if(count > 1) {
%><h2>Duplicate User, Access Denied</2><&
} else {
%><h2>Duplicate User, Access Denied</2><&
}
}
}
} catch (Exception ex) {
%><h2>There was Problem in Login.</2>
<p><%= ex.getMessage() %></p>
<&
}
}
%>
</body>
</html>
对于导入,我有点懒,使用了
*
- 这是不好的风格。
页面根据浏览器请求 (HTTP GET) 传送回浏览器(即客户端)。 请求中没有参数,所以输出的是表单。
浏览器提交表单后,这里为HTTP POST请求, 有参数。
现在可以进行数据库查询了。
Try-with-resources 确保所有内容都已关闭(连接、准备好的语句和结果集)。即使在返回/中断/异常时也是如此。
PreparedStatement 负责转义(说出一个带有撇号的名称)。最重要的是防止黑客攻击,SQL 注入(=创建邪恶的 SQL)。就像名称
admin
和密码 xxx' OR 1=1
。
在我那个时代,Access 并不是多用户数据库。您可以使用 Derby 或 H2 数据库。
JOptionPane
在交付的 HTML 页面中不起作用,甚至在服务器上创建页面时也不起作用。替代方案写在结果页上。
您选择了一个具有许多功能的硬主题。祝你好运。
由于 JSP 很快就会变得丑陋、不可读,请尝试使用 servlet,也许可以组合使用,使用纯 servlet 在 JSP 页面中进行编码和交付结果。