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

时间:2014-01-24 17:25:58

标签: java jsp

我有一个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>

3 个答案:

答案 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页面中进行编码和传递结果。