Java登录JSP页面(使用Access数据库)

问题描述 投票:0回答:3

我有一个 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>
java jsp
3个回答
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+"'";

0
投票

请勿连接

String
。使用
PreparedStatement
来避免 SQL 注入。

还要避免将密码存储在

String
变量上。尽可能使用
char[]
,并在使用后将其擦除,以避免在内存中留下明文密码。


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请求, 有参数。

现在可以进行数据库查询了。

Try-with-resources 确保所有内容都已关闭(连接、准备好的语句和结果集)。即使在返回/中断/异常时也是如此。

PreparedStatement 负责转义(说出一个带有撇号的名称)。最重要的是防止黑客攻击,SQL 注入(=创建邪恶的 SQL)。就像名称

admin
和密码
xxx' OR 1=1

在我那个时代,Access 并不是多用户数据库。您可以使用 DerbyH2 数据库。

JOptionPane
在交付的 HTML 页面中不起作用,甚至在服务器上创建页面时也不起作用。替代方案写在结果页上。

您选择了一个具有许多功能的硬主题。祝你好运。

由于 JSP 很快就会变得丑陋、不可读,请尝试使用 servlet,也许可以组合使用,使用纯 servlet 在 JSP 页面中进行编码和交付结果。

© www.soinside.com 2019 - 2024. All rights reserved.