代码之家  ›  专栏  ›  技术社区  ›  danksim

如何在Java课程注册系统中以用户身份登录

  •  1
  • danksim  · 技术社区  · 13 年前

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

    以下是我为RegServlet.java文件编写的代码,该文件接受用户输入并将其存储在DB中:

    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);
        }            
    }
    

    这是我的新User.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() 在那里我将用户名与存储在数据库中的密码进行匹配。如果用户名和密码匹配,我想为希望登录系统的学生启动一个会话,以搜索也将存储在DB中的课程。

    我该怎么做这个方法 doLogin()(登录) ? 我应该在哪里实施这种方法?在 doStuff() 方法还是另一节课?我应该如何开始身份验证过程?

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

    1 回复  |  直到 13 年前
        1
  •  1
  •   junk    13 年前

    首先,你不应该像现在在newUser.jsp中那样在Javascript中检查用户名和密码。你应该在服务器端这样做。文本“System not like a empty string”应该来自对类的调用。当您像现在这样将密码打印到javascript中时,如果用户查看源代码,它就会对用户可见。如果有人拦截了流量,那就不太安全了。

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

    现在,不要在会话变量中设置密码。太糟糕了。只需在会话变量中设置用户名即可。使用密码要更加小心。只有在用户名/密码正确的情况下,才能在会话变量中设置用户名。然后在索引页面上,你可以从会话中获取用户名,如果会话中的用户名不是null或空白,你就知道这个家伙已经登录了。否则,如果会话的用户名是null或空字符串,你就会知道这个家伙没有登录,所以重定向到登录页面。

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

    还有一件事:对于登录,您应该使用POST而不是GET,所以在servlet中将doGet更改为doPost,并在login.jsp中在表单标记中使method=POST。您不希望用户密码在地址栏中可见(get就是这样做的)。(表单标记中没有method=login这回事;它的method=post)

    此外,对于您的密码文本框,请使用type=“password”而不是type=“text”。不同的是,type='password'会在键入密码时使其模糊不清。