分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
1. 初始化設定 | : | .net Core 啟用Session |
2. 底層配置邏輯 | : | 進入Controller時設定Session與Session的使用操作 |
3. 控制器 | : | 頁面檢視的控制器,說明如何配置Session |
4. 檢視頁面 | : | 最後的Demo展示,將Session保存在伺服器後的結果於畫面上顯示 |
初始化中,需要配置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();
以下是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);
}
}
以下是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
}
控制器繼承了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();
}
}
首頁,用於檢視當前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>
觸發紀錄Session,主要邏輯於HomeController/AddSession
@{
ViewData["Title"] = "觸發增加Session";
}
<h1>@ViewData["Title"]</h1>
<p>將資料記錄到Session中</p>
剛進入首頁時,伺服器沒有任何Session資訊
點擊AddSession,可以觸發控制器紀錄Session
(想像成登入用戶帳號、密碼成功)
在點擊首頁,此時可以看到記錄在後端的Session都可以呼叫使用