首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET Session 為 Null 導致 NullReferenceException 解決方案

     編輯:程式設計綜合問答

錯誤現象

修改密碼頁面點擊按鈕拋出 `NullReferenceException`,堆疊指向 `Session["PWD"].ToString()`。

根本原因

`Session["PWD"]` 為 `null`(Session 過期、用戶未登入、應用程式池回收),直接呼叫 `.ToString()` 拋出例外。

修正程式碼

protected void Button1_Click(object sender, EventArgs e)
{
    // 1. 先檢查 Session 是否存在
    if (Session["username"] == null || Session["PWD"] == null)
    {
        Response.Write("");
        Response.Redirect("Login.aspx");
        return;
    }

    // 2. 取值
    string oldPwd = Session["PWD"].ToString();
    string userId = Session["username"].ToString();

    // 3. 輸入驗證
    if (string.IsNullOrEmpty(TextBox2.Text) || string.IsNullOrEmpty(TextBox3.Text))
    {
        ClientScript.RegisterStartupScript(this.GetType(), "", "alert('密碼不能為空!');", true);
        return;
    }

    if (TextBox1.Text != oldPwd)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "", "alert('舊密碼不正確!');", true);
        return;
    }

    if (TextBox2.Text != TextBox3.Text)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "", "alert('兩次新密碼不一致!');", true);
        return;
    }

    // 4. 參數化查詢防 SQL 注入
    string sql = "UPDATE TB_XueSheng SET PassWord=@pwd WHERE XueHao=@id";
    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@pwd", TextBox2.Text);
        cmd.Parameters.AddWithValue("@id", userId);
        conn.Open();
        int rows = cmd.ExecuteNonQuery();
        if (rows > 0)
            ClientScript.RegisterStartupScript(this.GetType(), "", "alert('修改成功!');", true);
        else
            ClientScript.RegisterStartupScript(this.GetType(), "", "alert('修改失敗,用戶不存在');", true);
    }
}

關鍵改進點

  1. Session 空值檢查:所有使用 Session 前必須判斷 `!= null`。
  2. 參數化查詢:杜絕字串拼接 SQL,防注入、型別安全。
  3. 使用 `using` 區塊:確保連線、命令正確釋放。
  4. 前端腳本註冊:用 `ClientScript.RegisterStartupScript` 替代 `Response.Write` 輸出 script,避免輸出順序問題。
  5. 密碼加密:生產環境**不可**明文儲存密碼,需使用 BCrypt/PBKDF2/Argon2 雜湊。

Session 管理最佳實踐

  • 登入時 `Session["User"] = userDto;` 存放完整用戶物件,避免多個 Session 鍵值分散。
  • 建立基底頁面類別 `BasePage : Page`,在 `OnInit` 統一檢查 Session,未登入自動導向登入頁。
  • 設定 `web.config` `` 適當超時時間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved