参考一:https://www.cnblogs.com/vipyoumay/p/7771237.html
参考二:https://www.cnblogs.com/stulzq/p/7729105.html
背景:原本使用cookie存储登录信息,使用nginx的ip_hash勉强解决多服务器问题,但是现在为了上k8s,因此使用docker,所以ip_hash没了,所以cooker方式pass掉了
过程:经过一系列baidu操作,最终觉得尝试使用 Redis 来存储 Session,以解决以上问题
总体分为两个步骤
一、存储登录信息到redis
1、添加 Microsoft.Extensions.Caching.Redis
2、在Startup.cs中添加配置
//添加redis配置 services.AddDistributedRedisCache(option => { //redis 连接字符串 option.Configuration = address; //redis 实例名 option.InstanceName = Configuration["InstanceName"]; }); //添加session配置 services.AddSession(options => { //session存活时间 options.IdleTimeout = TimeSpan.FromHours(Convert.ToDouble(Configuration["SessionTimeOut"])); //设为httponly options.Cookie.HttpOnly = true; });
//启用session
app.UseSession();
3、使用用session
//存 HttpContext.Session.SetString("UserId", user.UserId); //取 string UserId = HttpContext.Session.GetString("UserId") //清除() HttpContext.Session.Clear();
二、存储sessionid到redis
1、添加 ServiceStack.Redis.Core
2、添加配置
//添加数据保护(把sessionid存储到redis) services.AddDataProtection() .SetApplicationName("session_redis_application_name") .PersistKeysToStackExchangeRedis(Helper.getSessionConfig("address"), "DataProtection-Keys");
/// <summary> /// 获取session配置 /// </summary> /// <param name="address"></param> /// <returns></returns> public static StackExchange.Redis.ConnectionMultiplexer getSessionConfig(string address) { var redis = StackExchange.Redis.ConnectionMultiplexer.Connect(address); return redis; }
注意:这里有一个坑,ConnectionMultiplexer需要引用的命名空间有冲突,网上有说改名字能解决,但是我尝试失败了,也许是我的方式不对
我的项目是多层项目,所以我就把【获取session配置】放到Commin类库中,就解决了这个冲突
亲测有效