文章目录
- 前言
- Session
- ProtectedSessionStorage 类
- 信息加密
- 使用场景
- 代码部分
- Nuget扩展安装
- 源码
- 使用,
- 相关资料
前言
微软官方封装了一些浏览器的操作,其中就有Session的操作的封装
ProtectedSessionStorage 微软文档
因为我们知道,依赖注入的生命周期是
- Singleton
- 程序
- Scoped
- 网页:刷新,url直接跳转都会重置。
- Transient
- 路由
C# Blazor 学习笔记(10):依赖注入
但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。
Session
ProtectedSessionStorage 类
这个生命周期就很合适,就是你关闭浏览器了之后,信息就被抛弃了。这样网页刷新就不会丢失重要的信息。
一般和浏览器绑定的信息就是用户登录信息。
信息加密
ProtectedSessionStorage 类设置的信息是加密后的,所以看不到明文的信息。
CfDJ8Nur05I3Pu9OpTBL2jsIpP7iUkAMt6zG-CR1F5rHDriRSBlcJhnDIdmHxNEpoOoLe-atllUwiJM2zghFJE75-G_YV4VsgnO2O7jaBJsXvVf0RgaDfCDgtba81v3tUAsCQb_vJEnh5MDX-pWuTyxOaJjb-kicjqw2CU_DXa-0spbZXm-YfwsrQWyhGqm7q67T5_3y4SEbYSvMd7Lvvud1tTg_z1OUcWrSJhW_Exp6OWYmZqYOC5EpgsnkhSzrgqDvIMB2-FbZXjSNqj6NYvn1j7-FyVWvmiNtH-c9aVnY06GkdCJ0KH9X9xz1AG4GSGVxLB5As0nT4ZnzXyFQzGy47UCCdtCtdncVCjZLrMpGu4IPrvvifJpkCCxM466wYOJ070E9zz6agcY1YhPwDAY4CkE
使用场景
一般就是记录用户信息的,目的就是为了防止网页刷新的时候丢失用户信息。或者存放Token。理论上Session存的信息不能明文保存。
代码部分
我这里的代码进行了封装
- public class SessionObjectHelper
- Session帮助类
- public enum MySessionKey
- Key类
- public static class MySessionExtension
- Key的扩展方法
Nuget扩展安装
Newtonsoft.json:C#序列化
源码
using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
using Newtonsoft.Json;
namespace EmptyBlazorApp1.Service
{
public class SessionObjectHelper
{
private ProtectedSessionStorage _sessionStorage;
public SessionObjectHelper(ProtectedSessionStorage storage)
{
_sessionStorage = storage;
MySessionExtension.SessionStorage = storage;
}
public async Task<string> GetSession(string key)
{
var value = await _sessionStorage.GetAsync<string>(key);
return value.Success ? value.Value : "";
}
public async Task SetSession(string key, object value)
{
string valueStr = JsonConvert.SerializeObject(value, Formatting.None);
await _sessionStorage.SetAsync(key, valueStr);
}
public async Task<string> GetSession(MySessionKey key)
{
var value = await _sessionStorage.GetAsync<string>(key.ToString());
return value.Success ? value.Value : "";
}
public async Task<T> GetSession<T>(MySessionKey key) where T : class
{
var value = await _sessionStorage.GetAsync<string>(key.ToString());
//var res = new T();
var res = value.Success ? JsonConvert.DeserializeObject<T>(value.Value) : null;
return res;
}
public async Task SetSession(MySessionKey key, object value)
{
string valueStr = JsonConvert.SerializeObject(value, Formatting.None);
await _sessionStorage.SetAsync(key.ToString(), valueStr);
}
}
public enum MySessionKey
{
User,
}
public static class MySessionExtension
{
public static ProtectedSessionStorage SessionStorage { get; set; }
public static async Task SetSession(this MySessionKey key, object value)
{
string valueStr = JsonConvert.SerializeObject(value, Formatting.None);
await SessionStorage.SetAsync(key.ToString(), valueStr);
}
public static async Task<T> GetSession<T>(this MySessionKey key) where T : class
{
var value = await SessionStorage.GetAsync<string>(key.ToString());
//var res = new T();
var res = value.Success ? JsonConvert.DeserializeObject<T>(value.Value) : null;
return res;
}
}
}
使用,
在builder里面注入
services.AddScoped<SessionObjectHelper>();
使用
/// <summary>
/// 注入自定义Session依赖
/// </summary>
[Inject]
private SessionObjectHelper sessionObjectHelper { get; set; }
.......
/// <summary>
/// 双击点击跳转
/// </summary>
/// <param name="t_User"></param>
/// <returns></returns>
private async Task DoubleClickRowCallback(T_User t_User)
{
//设置值,可以直接传实体对象进去
await MySessionKey.User.SetSession(t_User);
//得到值,要设定泛型对象
var res = await MySessionKey.User.GetSession<T_User>();
navigationManager.NavigateTo($"/user/{t_User.Id}");
}
MySessionKey中添加放在浏览器Session里面的Key,然后使用
相关资料
ProtectedSessionStorage 微软文档
C# Blazor 学习笔记(10):依赖注入
Blazor Server 自定义登录退出鉴权判断
.net core 通过ProtectedSessionStorage 会话存储进行页面传值。案例前端采用Blazor