Blazor Session设置

文章目录

  • 前言
  • Session
    • ProtectedSessionStorage 类
      • 信息加密
      • 使用场景
    • 代码部分
      • Nuget扩展安装
      • 源码
        • 使用,
  • 相关资料

前言

微软官方封装了一些浏览器的操作,其中就有Session的操作的封装

ProtectedSessionStorage 微软文档

因为我们知道,依赖注入的生命周期是

  • Singleton
    • 程序
  • Scoped
    • 网页:刷新,url直接跳转都会重置。
  • Transient
    • 路由

C# Blazor 学习笔记(10):依赖注入

但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。

Session

ProtectedSessionStorage 类

Blazor Session设置_第1张图片

这个生命周期就很合适,就是你关闭浏览器了之后,信息就被抛弃了。这样网页刷新就不会丢失重要的信息。

一般和浏览器绑定的信息就是用户登录信息。

信息加密

ProtectedSessionStorage 类设置的信息是加密后的,所以看不到明文的信息。
Blazor Session设置_第2张图片

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>();

使用

        /// 
        /// 注入自定义Session依赖
        /// 
        [Inject]
        private SessionObjectHelper sessionObjectHelper { get; set; }
.......
/// 
/// 双击点击跳转
/// 
/// 
/// 
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

你可能感兴趣的:(Blazor基础知识,Blazor)