首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0043. .Net Core Website 的 Session 使用方法

日期:2023年 07月 15日

標籤: C# Asp.net Core Web MVC Web Session

摘要:C# 學習筆記


應用所需:1. Visual Studio 2022
     2. .net core Web專案 (Website MVC示範)
範例檔案:連結
解決問題:.net Core Website 專案使用 Session 模擬登入後記錄使用者資訊
應用層面:重要且具安全性的資料保存在伺服器端
基本介紹:本篇分為2大部分。
第一部分:範例專案說明
第二部分:Demo展示結果






第一部分:範例專案說明

Step 1:範例專案架構


1. 初始化設定 .net Core 啟用Session
2. 底層配置邏輯 進入Controller時設定Session與Session的使用操作
3. 控制器 頁面檢視的控制器,說明如何配置Session
4. 檢視頁面 最後的Demo展示,將Session保存在伺服器後的結果於畫面上顯示




Step 2:初始化設定

初始化中,需要配置Session的使用,因此在Program.cs 以下3項都是必需配置的


var builder = WebApplication.CreateBuilder(args);

//配置其他service configure...

//1. 使用Session
builder.Services.AddSession();
//2. 初始化HttpContext
builder.Services.AddHttpContextAccessor();

var app = builder.Build();
//3. 使用Session
app.UseSession();

//配置其他app configure...

app.Run();





Step 3:底層配置邏輯-1

以下是BaseController.cs 讓HomeController.cs繼承
任何繼承BaseController的控制器,都會在觸發執行前配置HttpContext


public class BaseController : Controller
{
    /// <summary>
    /// 1. 當觸發任何Controller執行前的動作
    /// </summary>
    /// <param name="context"></param>
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        //2. 呼叫SessionUtil.Configure 將當前的HttpContext存取者,記錄,使後續的Controller生命週期中都可以呼叫使用
        SessionUtil.Configure(HttpContext?.RequestServices?.GetService<IHttpContextAccessor>());
        base.OnActionExecuting(context);
    }
}




Step 4:底層配置邏輯-2

以下是SessionUtil.cs 提供Public讓進入Controller的呼叫都會紀錄Session。
並且提供使用的方法,這邊以SessionId、Account、DateTimeRecord、Age為紀錄資料


public static class SessionUtil
{
    private static IHttpContextAccessor _httpContextAccessor;
    /// <summary>
    /// 1. 增加一個方法,提供紀錄當前HttpContext 存取者
    /// </summary>        
    public static void Configure(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
    #region 2. 以下為要記錄的Session 資料
    /// <summary>
    /// SessionId
    /// </summary>
    public static string SessionId
    {
        get
        {
            return _httpContextAccessor?.HttpContext?.Session.GetString("SessionId") ?? string.Empty;
        }
        set
        {
            _httpContextAccessor?.HttpContext?.Session.SetString("SessionId", value);
        }
    }
    /// <summary>
    /// 帳號
    /// </summary>
    public static string Account
    {
        get
        {
            return _httpContextAccessor?.HttpContext?.Session.GetString("Account") ?? string.Empty;
        }
        set
        {
            _httpContextAccessor?.HttpContext?.Session.SetString("Account", value);
        }
    }
    /// <summary>
    /// 時間紀錄
    /// </summary>
    public static string DateTimeRecord
    {
        get
        {
            return _httpContextAccessor?.HttpContext?.Session.GetString("DateTimeRecord") ?? string.Empty;
        }
        set
        {
            _httpContextAccessor?.HttpContext?.Session.SetString("DateTimeRecord", value);
        }
    }
    /// <summary>
    /// 年齡
    /// </summary>
    public static int Age
    {
        get
        {
            return _httpContextAccessor?.HttpContext?.Session.GetInt32("Age") ?? 0;
        }
        set
        {
            _httpContextAccessor?.HttpContext?.Session.SetInt32("Age", Age);
        }
    }
    #endregion
}





Step 5:控制器

控制器繼承了BaseController.cs,使其生命週期在進入時會先記錄HttpContext,激活Session
以下是檢視器的說明:

1. Index 首頁,顯示當前Session的資料
2. AddSession 模擬登入成功,將Session紀錄

//1. 將Controller 繼承於 BaseController 使其記錄HttpContext
public class HomeController : BaseController
{
    private readonly ILogger<HomeController> _logger;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
    public IActionResult Index()
    {
        return View();
    }
    public IActionResult AddSession()
    {
        //2. 模擬假設登入時,會把Session記錄下來
        HttpContext.Session.SetString(nameof(SessionUtil.SessionId), HttpContext.Session.Id);
        HttpContext.Session.SetString(nameof(SessionUtil.Account), "Session工作者");
        HttpContext.Session.SetString(nameof(SessionUtil.DateTimeRecord), DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
        HttpContext.Session.SetInt32(nameof(SessionUtil.Age), 18);
        return View();
    }
}




Step 6:檢視頁面-1

首頁,用於檢視當前Session資訊


@using WebSiteSessionUtilExample.cs.Common.Util
@{
    ViewData["Title"] = "首頁-資訊";
}

<div class="text-center">
    <div>當前Session內容:</div>
    <table>
        <tr>
            <td>SessionId:</td>
            <td>@SessionUtil.SessionId</td>
        </tr>
        <tr>
            <td>登入者帳號:</td>
            <td>@SessionUtil.Account</td>
        </tr>
        <tr>
            <td>登入並紀錄Session時間:</td>
            <td>@SessionUtil.DateTimeRecord</td>
        </tr>
        <tr>
            <td>登入者年齡:</td>
            <td>@SessionUtil.Age</td>
        </tr>
    </table>
</div>




Step 7:檢視頁面-2

觸發紀錄Session,主要邏輯於HomeController/AddSession


@{
    ViewData["Title"] = "觸發增加Session";
}
<h1>@ViewData["Title"]</h1>

<p>將資料記錄到Session中</p>






第二部分:Demo展示結果

Step 1:首頁

剛進入首頁時,伺服器沒有任何Session資訊


Step 2:點擊增加Session

點擊AddSession,可以觸發控制器紀錄Session
(想像成登入用戶帳號、密碼成功)


Step 3:返回首頁

在點擊首頁,此時可以看到記錄在後端的Session都可以呼叫使用