我有一个Java登录应用程序,可以使用微软访问数据库来验证登录详细信息。我目前正在构建一个java Web应用程序,我只是想从我的工作示例中实现代码。
我的问题是我在这里有2个输入字段用于用户名和密码,(称为“名称”和“密码”)但我的SQL代码在上一个示例中有效,无法检测此页面上名为name和password的字段,用户将分别输入他们的详细信息。
非常感谢任何帮助!
<%@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>
答案 0 :(得分:0)
您的代码中存在两个问题..
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+"'";
答案 1 :(得分:0)
不要连接String
。使用PreparedStatement
来避免SQL注入。
还要避免在String
个变量上存储密码。尽可能使用char[]
,并在使用后擦除它,以避免在内存中留下明文密码。
答案 2 :(得分:0)
恭喜您尝试开发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请求, 有参数。
现在可以完成数据库查询了。
尝试使用资源确保所有内容均已关闭(连接,准备好的语句和结果集)。即使返回/中断/异常。
PreparedStatement负责转义(例如名称中带有撇号的名称)。最重要的是防止SQL injection被黑客入侵(=创建邪恶的SQL)。就像名称admin
和密码xxx' OR 1=1
一样。
在我看来,访问不是一个多用户数据库。您可以使用 Derby 或 H2 数据库。
JOptionPane
在交付的HTML页面中甚至在服务器上创建页面时均不起作用。替代方法是在结果页上书写。
您选择了一个具有很多功能的硬性话题。祝你好运。
随着JSP很快变得丑陋,难以理解,请尝试servlet(也许是结合使用)纯servlet,以在JSP页面中进行编码和传递结果。