首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaBean 實現用戶登入註冊完整實戰教學

     編輯:Java 相關知識

JavaBean 元件實現用戶登入、註冊與登出完整實例

本文詳細講解如何使用 JavaBean 封裝資料庫操作與業務邏輯,結合 JSP/Servlet 實現完整的用戶認證系統,包含登入驗證、用戶註冊、Session 管理與登出功能。

系統架構設計

1. JavaBean 核心規範

  • 類別必須為 public 且具備 無參數建構子
  • 屬性私有化,透過 getter/setter 方法暴露
  • 支援內省機制,供工具自動發現屬性
  • 實現 Serializable 介面以支援序列化

2. 系統架構圖層

  • 資料庫層:Oracle 資料表 P_USER (id, username, password, email)
  • 資料存取層 (DAO):DBAcess.java 封裝 JDBC 連線、查詢、更新、關閉資源
  • 業務邏輯層:UserBean.java 實現登入驗證、重複檢查、新增用戶
  • 工具類:GenerateUUID.java 生成唯一主鍵 ID
  • 表現層:JSP 頁面 (login, register, welcome, loginout)

核心代碼實現

1. 資料庫設計 (Oracle)

CREATE TABLE P_USER (
    id VARCHAR2(50) NOT NULL,
    username VARCHAR2(20),
    password VARCHAR2(20),
    email VARCHAR2(50)
) TABLESPACE USERS;

COMMENT ON TABLE P_USER IS '用戶表';
COMMENT ON COLUMN P_USER.id IS 'ID';
COMMENT ON COLUMN P_USER.username IS '用戶名';
COMMENT ON COLUMN P_USER.password IS '密碼';
COMMENT ON COLUMN P_USER.email IS 'Email';

2. 資料存取層 DBAcess.java

package com.baosight.bean;

import java.sql.*;

public class DBAcess {
    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    private String username = "scott";
    private String password = "tiger";
    
    private Connection conn;
    private Statement stmt;
    private ResultSet rs;

    // 建立連線
    public boolean createConn() {
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 更新操作 (INSERT/UPDATE/DELETE)
    public boolean update(String sql) {
        try {
            stmt = conn.createStatement();
            stmt.execute(sql);
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    // 查詢操作
    public void query(String sql) {
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 判斷是否有下一筆資料
    public boolean next() {
        try {
            return rs != null && rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    // 取得欄位值
    public String getValue(String field) {
        try {
            return rs != null ? rs.getString(field) : null;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 關閉資源方法群
    public void closeConn() { /* 關閉 Connection */ }
    public void closeStmt() { /* 關閉 Statement */ }
    public void closeRs() { /* 關閉 ResultSet */ }
    
    // Getter/Setter 略...
}

3. 業務邏輯層 UserBean.java

package com.baosight.bean;

public class UserBean {
    // 登入驗證
    public boolean valid(String username, String password) {
        DBAcess db = new DBAcess();
        if (db.createConn()) {
            String sql = "SELECT * FROM p_user WHERE username='" + username + "' AND password='" + password + "'";
            db.query(sql);
            boolean isValid = db.next();
            db.closeRs(); db.closeStmt(); db.closeConn();
            return isValid;
        }
        return false;
    }

    // 檢查用戶是否存在
    public boolean isExist(String username) {
        DBAcess db = new DBAcess();
        if (db.createConn()) {
            String sql = "SELECT * FROM p_user WHERE username='" + username + "'";
            db.query(sql);
            boolean exists = db.next();
            db.closeRs(); db.closeStmt(); db.closeConn();
            return exists;
        }
        return false;
    }

    // 註冊新用戶
    public boolean add(String username, String password, String email) {
        DBAcess db = new DBAcess();
        if (db.createConn()) {
            String sql = "INSERT INTO p_user(id, username, password, email) VALUES('" 
                + GenerateUUID.next() + "','" + username + "','" + password + "','" + email + "')";
            boolean success = db.update(sql);
            db.closeStmt(); db.closeConn();
            return success;
        }
        return false;
    }
}

4. UUID 生成工具 GenerateUUID.java

package com.baosight.util;

import java.util.Date;

public class GenerateUUID {
    private static Date date = new Date();
    private static int seq = 0;
    private static final int ROTATION = 99999;

    public static synchronized long next() {
        if (seq > ROTATION) seq = 0;
        date.setTime(System.currentTimeMillis());
        String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++);
        return Long.parseLong(str);
    }
}

JSP 頁面實現

1. 登入頁面 login.jsp

<form action="login_action.jsp" method="post">
  <table>
    <tr><td colspan="2">登入視窗</td></tr>
    <tr><td>用戶名:</td><td><input type="text" name="username" /></td></tr>
    <tr><td>密碼:</td><td><input type="password" name="password" /></td></tr>
    <tr><td colspan="2">
      <input type="submit" value="登入" /> 
      <a href="register.jsp">註冊</a>
    </td></tr>
  </table>
</form>

2. 登入處理 login_action.jsp

<%
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  
  if (username == null || username.trim().isEmpty() || 
      password == null || password.trim().isEmpty()) {
    response.sendRedirect("login.jsp");
    return;
  }
  
  UserBean userBean = new UserBean();
  if (userBean.valid(username, password)) {
    session.setAttribute("username", username);
    response.sendRedirect("welcome.jsp");
  } else {
    response.sendRedirect("login.jsp");
  }
%>

3. 歡迎頁面 welcome.jsp

<body>
  <td>歡迎你,</td><td>${username}</td>
  <form action="loginout.jsp" method="post">
    <input type="submit" value="登出" />
  </form>
</body>

4. 登出處理 loginout.jsp

<%
  session.removeAttribute("username");
  response.sendRedirect("login.jsp");
%>

5. 註冊頁面 register.jsp

<form action="register_action.jsp" method="post">
  <input type="text" name="username" placeholder="用戶名" />
  <input type="password" name="password1" placeholder="密碼" />
  <input type="password" name="password2" placeholder="確認密碼" />
  <input type="text" name="email" placeholder="Email" />
  <input type="submit" value="註冊" />
</form>

6. 註冊處理 register_action.jsp

<%
  String username = request.getParameter("username");
  String password1 = request.getParameter("password1");
  String password2 = request.getParameter("password2");
  String email = request.getParameter("email");
  
  // 驗證輸入
  if (username == null || password1 == null || password2 == null || 
      !password1.equals(password2)) {
    response.sendRedirect("register.jsp");
    return;
  }
  
  UserBean userBean = new UserBean();
  if (!userBean.isExist(username)) {
    userBean.add(username, password1, email);
    response.sendRedirect("login.jsp");
  } else {
    response.sendRedirect("register.jsp");
  }
%>

安全性與改進建議

  • SQL 注入防護:使用 PreparedStatement 替代字串拼接
  • 密碼加密:採用 BCrypt 或 PBKDF2 加鹽雜湊儲存
  • 連線池:引入 HikariCP 或 Druid 替代手動連線管理
  • 輸入驗證:前後端雙重驗證,防止 XSS 攻擊
  • Session 安全:設定 HttpOnly、Secure 標誌,實作 CSRF Token
  • 異常處理:統一錯誤頁面,避免堆疊追蹤洩露資訊

總結

本實例展示了 JavaBean 在 MVC 架構中封裝業務邏輯與資料存取的經典用法。雖然現代開發多採用 Spring、MyBatis 等框架,但理解 JavaBean 原理對掌握 Java Web 基礎至關重要。實際專案建議引入成熟框架提升開發效率與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved