.net core 3.0/3.1session持久化redis,session id为空
时间:2020-05-14
本文章向大家介绍.net core 3.0/3.1session持久化redis,session id为空,主要包括.net core 3.0/3.1session持久化redis,session id为空使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
.net core 3.1中将session持久化到redis,从core1.0开始,2.0/2.1,3.0/3.1每次搭建开发框架都因为session的问题搞的头大,次次踩坑,花了半天时间再次捋了一遍,发出来如果大家有跟我一样,希望能帮到你,另外如果有帮到你,记得点赞哈!!!
1.需引入的库文件
1.1:Microsoft.AspNetCore.Http.Extensions,因为.net core中的session默认只能存储字节,所以引入该库是为了解决session存储字符串
2.Microsoft.AspNetCore.Session,Microsoft.Extensions.Caching.Redis,针对session扩展
3.StackExchange.Redis为redis驱动
4.Newtonsoft.Json我自己项目常使用的序列化工具,可根据自己的需求使用
项目针对session持久化redis的配置
"SessoinConfig": { // Session配置 "RedisCacheConfig": { "ConnectionString": "ip:端口,ssl=false,password=密码,defaultdatabase=redis库索引", "InstanceName": "自定义实例名" }, "SessionTimeOut": 60 //session过期时长,分钟 }
注入实体类:
/// <summary> /// Session缓存配置 /// </summary> public class SessoinConfig { /// <summary> /// session过期时长,分钟 /// </summary> public int SessionTimeOut { get; set; } /// <summary> /// 实例库索引 /// </summary> public RedisCacheConfigData RedisCacheConfig { get; set; } } /// <summary> /// Session持久化Redis配置 /// </summary> public class RedisCacheConfigData { /// <summary> /// Redis连接字符串 /// </summary> public string ConnectionString { get; set; } /// <summary> /// Redis实例名称 /// </summary> public string InstanceName { get; set; } }
IServiceCollection扩展
/// <summary> /// Session持久化至Redis /// </summary> /// <param name="services"></param> /// <param name="Configuration"></param> public static void UseSession(this IServiceCollection services, SessoinConfig sessoinConfig) { services.AddSingleton<IDistributedCache>( serviceProvider => new RedisCache(new RedisCacheOptions { Configuration = sessoinConfig.RedisCacheConfig.ConnectionString, InstanceName = sessoinConfig.RedisCacheConfig.InstanceName })); // 添加Session并设置过期时长 services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(sessoinConfig.SessionTimeOut); }); }
Startup服务添加容器方法ConfigureServices
// 读取Session配置文件 IConfigurationSection sessionCacheSections = Configuration.GetSection("SessoinConfig"); SessoinConfig sessionCacheConfig = sessionCacheSections.Get<SessoinConfig>(); services.UseSession(sessionCacheConfig);
Startup运行时方法Configure使用Session
// 使用Session app.UseSession();
自定义Session扩展
/// <summary> /// Session扩展 /// </summary> public static class SessionExtensions { /// <summary> /// 添加Session /// </summary> /// <param name="session"></param> /// <param name="key"></param> /// <param name="value"></param> public static void SetObjectAsJson(this ISession session, string key, object value) { session.SetString(key, JsonConvert.SerializeObject(value)); } /// <summary> /// 添加Session /// </summary> /// <param name="session"></param> /// <param name="key"></param> /// <param name="value"></param> public static void SetObjectAsJson<T>(this ISession session, string key, T value) { session.SetString(key, JsonConvert.SerializeObject(value)); } /// <summary> /// 获取Session /// </summary> /// <typeparam name="T"></typeparam> /// <param name="session"></param> /// <param name="key"></param> /// <returns></returns> public static T GetObjectFromJson<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value); } /// <summary> /// 删除Session /// </summary> /// <param name="session"></param> /// <param name="key"></param> public static void RemoveSession(this ISession session, string key) { var value = session.GetString(key); if (value != null) { session.Remove(key); } } }
例如我存储登录验证码
/// <summary> /// 用户登录验证码 /// </summary> protected string ValidateCodeData { get { return HttpContext.Session.GetObjectFromJson<string>(LoginValidateCodeSessionKey); } set { HttpContext.Session.SetObjectAsJson<string>(LoginValidateCodeSessionKey, value); } }
/// <summary> /// 获取验证码 /// </summary> /// <returns></returns> public IActionResult ValidateCode() { System.IO.MemoryStream ms = _logic.LoginValidateCode(out string code, 4); ValidateCodeData = code; Response.Body.Dispose(); return File(ms.ToArray(), @"image/png"); }
欢迎转载,转载请保留出处,哈哈哈
原文地址:https://www.cnblogs.com/lixiaojun1009/p/12890498.html
- Spring Boot Server容器配置
- Spring Boot读取配置的几种方式
- 如何用TensorFlow构建RNN?这里有一份极简的教程
- (1024程序员节快乐)阿里祭出大器,Java代码检查插件
- Java多线程神器:join使用及原理
- SpringCloud配置中心内容加密
- Spring Boot日志集成
- MongoDB系列7:MongoDB存储引擎
- MongoDB系列6:MongoDB索引的介绍
- 文本数据处理的终极指南-[NLP入门]
- 神经网络思想建立LR模型(DL公开课第二周答案)
- 如何用卷积神经网络从歌曲中提取纯人声?这里有教程+代码
- 排序算法对比、总结(Python代码)
- 记一道未能答出的算法面试题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode79|平方数之和
- LeetCode91|寻找重复数
- LeetCode90|两个数组的交集
- LeetCode89|在排序数组中查找数字I
- LeetCode88|两数之和IV-输入BST
- LeetCode98|判定字符是否唯一
- LeetCode97|合并两个有序链表
- LeetCode99|数组中出现次数超过一半的数字
- redis源码之hash结构的实现
- redis源码之set结构
- redis源码之zset结构的实现
- Elasticsearch: range 数据类型及基于range的聚合 (7.4发行版新功能)
- 漫画:如何在数组中找到和为 “特定值” 的三个数?
- 除了MySQL,大牛DBA还会啥?
- 用 Docker swarm 快速部署分布式图数据库 Nebula Graph 集群