更新於 2024/11/04閱讀時間約 10 分鐘

補充教學-資料儲存Session

    在 C# 的 Web 開發中,Session、Cookie 和資料庫是三種常用的儲存和管理資料的方式。以下是它們的功能、優缺點比較:


    Session

    • 功能:

    Session 是一種在伺服器端保存使用者資料的方式,會話期間資料會存儲在伺服器中,並且在瀏覽器關閉或 Session 超時後自動清除。每個使用者會有一個唯一的 Session ID,用於區分不同的用戶。

    • 優點:
    1. 安全性較高,因為資料儲存在伺服器端,減少了敏感資訊暴露的風險。
    2. 能夠存儲較大的資料量,適合短期內需要頻繁使用的資料。
    3. Session 自動過期,減少了伺服器負載。
    • 缺點:
    1. 過多使用可能會增加伺服器負擔,尤其是大量使用者同時在線時。
    2. 須管理 Session 過期時間,並處理過期 Session 的清理問題。
    3. 無法在不同的伺服器間共享,除非使用分散式 Session 方案或外部 Session 管理服務。

    Cookie

    • 功能

    Cookie 是一種在用戶端(瀏覽器)儲存資料的方式。資料會存儲在使用者的瀏覽器中,並且可以在之後的請求中發送回伺服器。適合儲存非敏感的簡單資料,例如偏好設定或身份標識。

    • 優點
    1. 可以在不同頁面甚至不同訪問間共享資料。
    2. 支援長期保存,例如「記住我」功能,可以保存幾天甚至幾個月。
    3. 使用者可以自由刪除 Cookie,有助於隱私控制。
    • 缺點
    1. 容量限制,一般最多 4KB,不能存儲大量資料。
    2. 安全性低於 Session,敏感資料可能暴露,需配合加密技術保護。
    3. 容易受到跨站點腳本攻擊(XSS)等安全威脅。

    資料庫

    • 功能

    資料庫是一種長期儲存資料的方式。應用程式通常會將需要永久保存的資料存儲到資料庫中,例如用戶帳戶資訊、交易紀錄等。可以與伺服器端代碼進行互動,進行 CRUD(創建、讀取、更新、刪除)操作。

    • 優點
    1. 可用於儲存大量且持久的資料,適合儲存需要永久保存的資料。
    2. 資料庫提供查詢功能,能快速檢索大量數據。
    3. 支援多種數據一致性和備份方案,有較好的可靠性。
    • 缺點
    1. 存取資料庫的速度比 Session 和 Cookie 慢,並且可能需要額外的 I/O 開銷。
    2. 資料庫架構和管理較為複雜,需配置備份和恢復機制。
    3. 資料庫的安全和效能會受到高並發訪問的影響。


    在這裡我們預計使用Session來當作儲存的方式,以下使用一個計數器程式來當作範例

    SessionSample.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SessionSample.aspx.cs" Inherits="SessionSample" %>

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    計數器1
    <asp:Label ID="Label1" runat="server" Text="0"></asp:Label>
    <br />
    <asp:Button ID="Button1" runat="server" Text="計數1" OnClick="Button1_Click" />
    <br /><br />
    計數器2
    <asp:Label ID="Label2" runat="server" Text="0"></asp:Label>
    <br />
    <asp:Button ID="Button2" runat="server" Text="計數2" OnClick="Button2_Click" />
    </div>
    </form>
    </body>
    </html>

    SessionSample.aspx.cs

    public partial class SessionSample : System.Web.UI.Page
    {
    int counter1 = 0; //計數器1
    int counter2 = 0; //計數器2

    protected void Page_Load(object sender, EventArgs e)
    {
    //計數器1作法
    //(無,在這裡無動作)

    //計數器2作法
    //網頁第一次載入(HTTP GET),按下counter2按鈕是HTTP POST
    // IsPostBack:是否是HTTP POST
    if (IsPostBack == false)
    {
    // 如果不存在,初始化計數器為 0
    Session["Counter"] = 0;
    }
    }

    //計數器1作法
    protected void Button1_Click(object sender, EventArgs e)
    {
    counter1 += 1;
    Label1.Text = counter1.ToString();

    //按下計數器1多少次,次數都不會改變
    //因為每次按下按鈕後Button1_Click(),counter+=1,Label1顯示1,然後網頁載入網頁
    //載入網頁會先從Page_Load()開始,此時counter1為1,所以Label1顯示1
    }

    //計數器2作法
    protected void Button2_Click(object sender, EventArgs e)
    {
    counter2 = (int)Session["Counter"]; //從session取得現在的counter次數
    counter2 += 1;

    Label2.Text = counter2.ToString();

    Session["Counter"] = counter2; //將counter2儲存到session
    }
    }

    執行結果:

    以上範例,計數器1不管按下幾次,都只會是1,但是計數器2,每次按下後,透過Session會繼續累加下去。

    後續21點遊戲會使用Session來儲存牌堆(Deck)與莊家(Player)、玩家(Player)的手牌資訊。

    補充一下Session逾時(Timeout)設定,C# ASP.Net Session預設逾時時間是20分鐘,超過後Session就會自動消失。

    以下有兩種方式來變更Session.Timeout設定

    1.使用Global.asax

    (Visual Stdio專案加入新項目,選擇全域應用程式類別,檔名為Global.asax)

    #Global.asax介紹

    #Global.asax用法分析

    //Golbal.asax裡面原本就存在Session_Start(),在裡面加入設定
    void Session_Start(object sender, EventArgs e) {
    // 設定 Session 存在時間為 30 分鐘
    Session.Timeout = 30;
    }

    2.修改web.config內容

    (每個Visual Studio專案內,預設都有一個web.config檔案)

    #微軟web.config介紹

    <!--在web.config裡面找到以下內容-->
    <configuration>
    <system.web>
    <!--加入以下這一行-->
    <sessionState timeout="30" />
    </system.web>
    </configuration>

    以上兩種變更方式,都會將Session的逾時時間變更為30分鐘

    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.