[Lập trình JSP – Servlet] Bài 7: Viết chức năng đăng nhập, đăng ký thành viên

Lập trình JSP – Servlet cho phép các nhà phát triển phần mềm xây dựng nội dung động cho website sử dụng nền tảng Java. Tiếp ngay sau đây sẽ là phần hướng dẫn chức năng đăng nhập, đăng ký thành viên trong loạt video hướng dẫn xây dựng website bán hàng bằng JSP – Servlet mong các bạn chú ý đón xem.

Đối với mỗi website bán hàng, tin tức… thì đa số nhà quản lý muốn quản lý thành viên của mình một cách tốt nhất, luôn muốn họ cần gì, xem gì,… và cách tốt nhất là cung cấp cho người dùng tài khoản ở website. Đăng nhập, đăng ký là chức năng cần thiết không chỉ riêng gì website JSP – Servlet, đối với website bán hàng thì việc đặt hàng có thể được lưu lại thông tin giỏ hàng của bạn, ngoài ra bạn có thể xem lại đơn hàng, bình luận, gởi ý kiến liên hệ, nhận thông tin khuyến mãi…

Bài viết này sẽ hướng dẫn các bạn chi tiết tạo chức năng đăng nhập, đăng ký bằng JSP – Servlet của website. Việc đăng ký thực ra đơn giản chỉ là thêm 1 dòng dữ liệu vào cơ sở dữ liệu sau khi kiểm tra nhập dữ liệu của người dùng, để an toàn bạn có thể mã hóa mật khẩu của người dùng.

Bước 1: Tạo lớp tài khoản dùng để chứa thông tin người dùng như mã tài khoản, tên đăng nhập, mật khẩu, địa chỉ… tùy vào website mà bạn có thể biến hóa, các thông tin trên nhất định nên có.

Phần đăng ký tài khoản

Khi đăng ký, chúng ta có thể sử dụng thêm ajax kết hợp JSP – Servlet để bắt lỗi ví dụ như tài khoản email đã tồn tại hay chưa. Bạn có thể sử dụng đoạn mã ajax bên dưới để gọi đến Servlet xử lý.

HTML dùng để nhập địa chỉ và hiển thị

Servlet xử lý kiểm tra xem email đã tồn tại hay chưa?

Phần đăng nhập hệ thống

Bước 2: Viết các phương thức như tạo tài khoản, kiểm tra đăng nhập…

Bước 3: Ở trang JSP bạn sẽ chỉnh sửa form nhập dữ liệu, form đăng nhập. Sau đó tạo servlet để xử lý, với 2 chức năng đăng nhập và đăng ký bạn có thể tạo 1 hoặc 2 servlet để xử lý đều được. Nếu mới học bạn nên tạo riêng lẻ, sau này nên gộp chung để code được rút gọn, tránh rườm rà.

Lưu ý: Mật khẩu bạn nên mã hóa để tránh mất thông tin người dùng, có nhiều chuẩn mã hóa khác nhau và bạn có thể tham khảo đoạn mã hóa MD5 bên dưới của mình

Đoạn mã kiểm tra tên đăng nhập và mật khẩu

Bạn có thể xem video hướng dẫn xây dựng chức năng đăng nhập, đăng ký thành viên bên dưới;

Hoặc bạn có thể tải mã nguồn cho bài viết lập trình JSP – Servlet chức năng đăng nhập, đăng ký thành viên tại đường dẫn sau:

Xem thêm một số bài viết liên quan lập trình JSP – Servlet:

Video hướng dẫn xây dựng website bán hàng sử dụng JSP – Servlet:
Bài 3: Hướng dẫn sử dụng JDBC kết nối cơ sở dữ liệu MySQL
Bài 4: Hiển thị danh mục sản phẩm
Bài 5: Hiển thị sản phẩm theo danh mục
Bài 6: Hiển thị thông tin chi tiết sản phẩm
Bài 8: Xây dựng chức năng giỏ hàng

Lời kết: Như vậy chúng ta vừa tìm hiểu về hướng dẫn chức năng đăng nhập, đăng ký thành viên trong loạt bài xây dựng website bán hàng bằng JSP – Servlet. Ngoài ra, các bạn có thể xem thêm các bài viết khác trong chuyên mục lập trình JSP – Servlet để có thể tự xây dựng hoàn chỉnh một website cho riêng mình.

(Tác giả: Tùng Dương)

65 thoughts on “[Lập trình JSP – Servlet] Bài 7: Viết chức năng đăng nhập, đăng ký thành viên

  1. Trần Trọng Đại

    - Edit

    Reply

    mod ơi. navicat chỉ kết nối được với localhost khi có kết nối internet thôi à? hôm nay mình ngắt kết nối internet thì không thể truy cập được vào cơ sở dữ liệu vì lỗi 2005. Mod có cách giải quyết nào không?

    1. bạn chỉ cần kết nối mạng limit cũng được, hoặc bạn vào trình duyệt gõ localhost xong vào phpmyadmin cũng quản lý được

    2. Bạn click chuột phải vào connect localhost trong Navicate vào chọn connect properties.. bạn chỉ cần thay đổi hostname là localhost thành 127.0.0.1 thì off line cũng connect được bạn nhé!

  2. Anh cho em hỏi : Đây là các trang jsp anh cho n chạy độc lập, còn khi người dùng click thỳ chuyển trang.. Cái đấy thỳ làm như thế nào a?

  3. Mình đang làm đến phần đăng ký thành viên thì gặp lỗi này: Sau khi click vào “Register” thì hiện lỗi “cannot be cast to model.Users”
    Xin lỗi vì mình ko thể gửi ảnh lên được, đành gửi file log, nhờ bạn xem giúp mình. Mình cám ơn!

    type Exception report

    message org.apache.jasper.JasperException: An exception occurred processing JSP page /header.jsp at line 18

    description The server encountered an internal error that prevented it from fulfilling this request.

    exception

    org.apache.jasper.JasperException: org.apache.jasper.JasperException: An exception occurred processing JSP page /header.jsp at line 18

    15: CategoryDao categoryDao = new CategoryDao();
    16: Users users = null;
    17: if(session.getAttribute(“user”) != null){
    18: users = (Users) session.getAttribute(“user”);
    19: }
    20: %>
    21:

    Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:555)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:461)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    controller.UsersServlet.doPost(UsersServlet.java:55)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    root cause

    org.apache.jasper.JasperException: An exception occurred processing JSP page /header.jsp at line 18

    15: CategoryDao categoryDao = new CategoryDao();
    16: Users users = null;
    17: if(session.getAttribute(“user”) != null){
    18: users = (Users) session.getAttribute(“user”);
    19: }
    20: %>
    21:

    Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:574)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:935)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:185)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    controller.UsersServlet.doPost(UsersServlet.java:55)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    root cause

    java.lang.ClassCastException: java.lang.String cannot be cast to model.Users
    org.apache.jsp.header_jsp._jspService(header_jsp.java:132)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:935)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:185)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    controller.UsersServlet.doPost(UsersServlet.java:55)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    note The full stack trace of the root cause is available in the Apache Tomcat/8.0.36 logs.

      1. chào admin, o phần đăng ký minh thấy bạn lam chưa xong mà b đã bỏ qua, đó là khi đăng ký xong thi trong bang user chỉ lưu trữ đc địa chỉ email còn pass vẫn null, vậy khi đăng nhập phai điền pass va lại phai mã hóa trc kìa….

        1. Thường mà mình làm thi chỗ password mình ko tạo mà khi người dùng tạo tài khoản sẽ có 1 mail gởi về mail họ tạo sau đó người dùng nhấn vao link xác nhận đăng ký thì mình lại viết 1 hàm tự động sinh pass và mới gởi pass về mail cho người dùng. Video hướng dẫn của mình thi chỉ trình bày cách co bản còn bạn có thể áp dụng hoặc tùy biến thêm.

  4. It抯 laborious to search out knowledgeable people on this subject, but you sound like you understand what you抮e speaking about! Thanks

  5. This is the appropriate blog for anybody who wants to find out about this topic. You notice a lot its almost onerous to argue with you (not that I truly would need匟aHa). You definitely put a new spin on a subject thats been written about for years. Great stuff, simply great!

  6. ad cho minh hoi la cai ma hoa password MD5 cua ad hinh nhu la khi user dang ky tai khoan, password khong tu dong duoc ma hoa phai khong?

      1. Võ Thanh Nguyên Công

        - Edit

        Reply

        mình bị lỗi này là sao vậy mod?
        java.lang.NullPointerException
        DAO.UsersDAO.insertUser(UsersDAO.java:41)
        controller.UsersServlet.doPost(UsersServlet.java:48)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

  7. Chào ad, trong CSDL, ad lại bỏ check tự tăng ID của category và product, tại sao ad lại làm v, có ảnh hưởng gì không nếu sau này liên kết các bảng với nhau

  8. ad cho hỏi
    nó chỉ check 1 dấu tích là chưa có email
    còn khi mình ghi trùng email thì nó vẫn check là chưa có email

        1. Chào bạn, bạn kiểm tra lại hàm checkemail thử, có thể mình viết sai hàm này nên khi nhập nó vẫn báo ok

  9. Lamf thế nào để đưa đăng nhập vaò web z. Tôi làm xoq hết rồi nhungw ko biết cáchthêm nó vaò web cuaủa tôi. Chỉ jup tôi vs. ….

    1. Chào bạn, bạn muốn đưa đăng nhập vào web là ntn, trong bài viết mình có hướng dẫn chức năng đăng nhập đăng ký rồi, hay ý bạn muốn đăng nhập qua mạng xa hội.

  10. muốn tự động tăng id khi mỗi lần đăng kí tài khoản thì làm kiểu gì.
    trong hướng dẫn admin chỉ cho hiện thị theo time.
    Nhờ admin giup m voi

  11. ADMIN ơi cho em hỏi cách khắc phục lỗi này ạ
    java.lang.NullPointerException
    dao.UsersDAO.insertUser(UsersDAO.java:47)
    controller.UsersServlet.doPost(UsersServlet.java:47)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

          1. Nguyễn Anh Tuấn

            - Edit

            Toàn bộ dữ lieu từ CSDL up lên thì được mà từ trang web nhập vào lại ko được

          1. chưa viết login thì insert bình thường, nhưng viết login xong, thì nó ko lưu vào CSDL được, tài khoản vẫn hiển thị trên index

  12. Sau khi code xong, lúc đầu thì đăng ký được. Sau khi viết login xong, thì đăng ký tài khoản không lưu vào CSDL là sao vậy Admin

      1. Mình bị lỗi tương tự. Nó báo như thế này (Hình như insert null thì phải):

        thg 11 25, 2017 10:28:12 CH Dao.TaiKhoanDao themTaiKhoan
        SEVERE: null
        com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column ‘MatKhau’, table ‘QuanLyThietBi.dbo.TaiKhoan’; column does not allow nulls. INSERT fails.
        at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:156)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1373)
        at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:371)
        at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:322)
        at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4003)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1550)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:160)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:133)
        at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:290)
        at Dao.TaiKhoanDao.themTaiKhoan(TaiKhoanDao.java:80)
        at Controller.TaiKhoanServlet.doPost(TaiKhoanServlet.java:65)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

      2. đã fix đc. sửa lại trong UserServlet như thế này:
        user.setMatKhau(MD5.encryption(request.getParameter(“password”)));

  13. Nguyễn Mạnh Cường

    - Edit

    Reply

    ad ơi sao mình code mà nó bị lỗi này:
    Etat HTTP 404 – /IT/UserServlet

    type Rapport dӎtat

    message /IT/UserServlet

    description La ressource demandée n”est pas disponible.

    Apache Tomcat/8.0.27

    code mình đây:
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //processRequest(request, response);
    String command = request.getParameter(“command”);
    String url=””;
    switch(command){
    case”insert”:
    User user = new User();
    user.setName(request.getParameter(“name”));
    user.setUserName(request.getParameter(“username”));
    user.setPassword(request.getParameter(“password”));
    userDao.InsertUser(user);
    HttpSession session = request.getSession();
    session.setAttribute(“user”, user);
    url = “login.jsp”;
    break;

    }
    RequestDispatcher rd = getServletContext().getRequestDispatcher(url);
    rd.forward(request, response);
    }

    1. Nguyễn Mạnh Cường

      - Edit

      Reply

      còn này là hàm nhập vs register.jsp:
      public boolean InsertUser(User u) {
      Connection conn = Connect.getConnecttion();
      String insert_user = “INSERT INTO user(name, user_name, password) values(?,?,?)”;
      try {
      PreparedStatement ps = conn.prepareStatement(insert_user);
      ps.setString(1, u.getName());
      ps.setString(2, u.getUserName());
      ps.setString(3, u.getPassword());
      ps.executeUpdate();
      return true;
      } catch (SQLException ex) {
      Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
      return false;
      }

      Register Page

      $(document).ready(function () {
      var x_timer;
      $(“#username”).keyup(function (e) {
      clearTimeout(x_timer);
      var user_name = $(this).val();
      x_timer = setTimeout(function () {
      check_username_ajax(user_name);
      }, 1000);
      });

      function check_username_ajax(username) {
      $(“#user-result”).html(”);
      $.post(‘CheckUserNameServlet’, {‘username’: username}, function (data) {
      $(“#user-result”).html(data);
      });
      }
      });

      Sign up


      Sign up

  14. Chào bạn, mình thấy những bài của bạn viết rất hay. Bạn cho mình hỏi 1 chút và hashSet với hashMap tý nhé. Bạn có thể giải thích cho mình kỹ một chút về cái đấy và vì sao lại dùng cái đấy để liên kết các bảng với nhau đc k bạn. Mong bạn phản hồi sớm

    1. HashMap bao gồm key và value.
      HashMap myMap= new HashMap();
      myMap.put(1, “First”);
      myMap.put(2,”Second”);
      HashSet là một tập hợp không bị trùng lắp
      HashSet mySet= new HashSet();
      mySet.add (“First”);
      mySet.add (“Second”);

      1. Cho mình hỏi cái nữa là bên server mình muốn respone lại 1 object thì sẽ gửi như nào ? và bên Client request như nào để ra đc vậy

  15. add cho hỏi e sai chỗ nào vậy mà nhập email trung email trong database nó vẫn báo chấp nhận.

    $(document).ready(function () {
    var x_timer;
    $(“#username”).keyup(function (e) {
    clearTimeout(x_timer);
    var user_name = $(this).val();
    x_timer = setTimeout(function () {
    check_username_ajax(user_name);
    }, 1000);
    });

    function check_username_ajax(username) {
    $(“#user-result”).html(”);
    $.post(‘CheckEmailServlet’, {‘username’: username}, function (data) {
    $(“#user-result”).html(data);
    });
    }
    });

    Register

    Username *

    Password *

    ————————————–

    public boolean checkEmail(String email){
    // kiem tra ton tai cua email
    Connection conn = ConnectionDB.openConnection();
    String sql =”select * from user_email where email='”+email+”‘”;
    try {
    PreparedStatement ps = conn.prepareCall(sql);
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
    conn.close();
    return true;
    }
    } catch (SQLException ex) {
    Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    return false;
    }

Bình luận

Loading...