1

我正在使用 Web 项目在 Netbeans 上创建一个非常基本的课程注册表单。我已经设法让它达到学生可以通过填写注册表来注册的程度。然后将输入的信息保存到 Derby DB 中。现在我需要它来允许注册学生登录以搜索要添加/删除的课程。

这是我的 RegServlet.java 文件的代码,它接受用户输入并将它们存储在数据库中:

public class RegServlet extends HttpServlet {
SaveToDB toDB = new SaveToDB();

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        try {
            doStuff(request, response);
        } catch (SQLException ex) {
            Logger.getLogger(RegServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    } catch (InstantiationException ex) {
        Logger.getLogger(RegServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(RegServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void doStuff(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, InstantiationException, IllegalAccessException, SQLException {
    //see if search parameter is present        
    String userName = request.getParameter("userName");
    String passWord = request.getParameter("passWord");                
    if(!userName.isEmpty()&&!passWord.isEmpty()&&!lastName.isEmpty()&&!firstName.isEmpty()&&!age.isEmpty()&& (sex=='F' || sex=='M') &&!email.isEmpty()) {
        request.setAttribute("userName", userName);
        request.setAttribute("passWord", passWord);

        toDB.createConnection();
        toDB.insertNewUser(userName, passWord, lastName, firstName, age, sex, email);
        RequestDispatcher view = request.getRequestDispatcher("login.jsp");
        view.forward(request, response);            
    } else {
        RequestDispatcher view = request.getRequestDispatcher("index.jsp");
        view.forward(request, response);
    }            
}

这是我的 newUser.jsp 文件:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>New User Registration</title>
</head>
<body>
    <form method="get" action="RegServlet">
        <h1>Register!</h1>
            Fill out information below:<p>                

            Username:
            <input type="text" name="userName" value =""><p>
            Password:
            <input type="text" name="passWord" value =""><p>                

            <input type="submit" value="Finish!"><p>


                <script type="text/javascript">
                    var var1 = "<%= (String) request.getAttribute("userName")%>";
                    if(var1 == (""))
                        document.write("<bSystem doesn't like an empty string.....Try Again!!!</b>");    

                    var var2 = "<%= (String) request.getAttribute("passWord")%>";
                    if(var2 == (""))
                        document.write("<bSystem doesn't like an empty string.....Try Again!!!</b>");
                </script>


    </form>
</body>

这个 jsp 代码片段<form method="get" action="RegServlet">将我的代码链接到 RegServlet.java 文件,在 RegServlet 类中,我曾经RequestDispatcher将用户发送到名为 login.jsp 的下一页以实际登录。

我需要一些有关 login.jsp 文件的帮助。这是我的 login.jsp 文件:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Login Page</title>
</head>
<body>
    <form method="Login" action="RegServlet">
    <h1>Login!</h1>        
    Username:
    <input type="text" name="userName" value =""><p>
    Password:
    <input type="text" name="passWord" value =""><p>

    <input type="submit" value="Login!"><p>
</body>

doLogin()在我的 RegServlet.java 类文件中命名了另一个方法doStuff(),我将在其中将用户名与存储在数据库中的密码匹配。如果用户名和密码匹配,我想为希望登录系统的学生启动一个会话,以搜索也将存储在数据库中的课程。

我该怎么做doLogin()?我应该在哪里实现这个方法?下doStuff()方法?还是别的班?我应该如何开始身份验证过程?

在处理所有安全问题之前,我只是先练习基础知识。

4

1 回答 1

1

好吧,首先,您不应该像现在在 newUser.jsp 中那样检查 Javascript 中的用户名和密码,而应该在服务器端进行。该文本“系统不喜欢空字符串”应该来自对类的调用。当您像正在做的那样将密码打印到 javascript 中时,如果用户查看源代码,它就会对用户可见。如果有人拦截流量,则不是很安全。

此外,一旦您验证了 servlet 中的用户名/密码,您应该执行 response.sendRedirect 而不是转发。Forward 会将所有参数转发到下一页。您无需将密码转发到每个页面。如果用户名/密码正确,设置一个会话变量,sendRedirect 到索引页面,并在索引页面上拉会话变量并检查该人是否已登录,如果没有,则重定向回登录页面。

现在,不要在会话变量中设置密码。那很糟。只需在会话变量中设置用户名。对密码更加小心。如果用户名/密码正确,则仅在会话变量中设置用户名。然后在索引页面上,您可以从会话中获取用户名,如果会话中的用户名不为空或为空,则表明该人已登录。否则,如果会话中的用户名为空或空字符串,则您知道人没有登录,所以重定向到登录页面。

至于将 doLogin 与 doStuff 放在哪里,登录 servlet 实际上只需要验证登录,那么为什么不将 doStuff 重命名为 doLogin 并将所有代码放在那里呢?

还有一件事:对于登录,您应该使用 POST 而不是 GET,因此在您的 servlet 中将 doGet 更改为 doPost,并在您的 login.jsp 中在您的表单标签中设置 method=POST。您不希望在地址栏中显示用户密码(这就是 get 所做的)。(表单标签中没有method=login;它的me​​thod=post)

此外,对于您的密码文本框,请使用 type="password" 而不是 type="text"。不同之处在于, type='password' 会在输入密码时隐藏密码。

于 2013-04-17T23:00:34.403 回答