描述:默认asp.net core mvc 是没有开启session的需要我我们手动引用,session也是存储在服务器的内存中的,如果想要在分布式的应用中也使用session,那么可以配置存储的位置,比如redis,mysql中,下面就以redis为例。
1.引入redis的nuget包
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.0" />
2.添加session的服务和配置
在ASP.NET Core中,Session数据实际上是存储在服务器端的,而不是直接存储在浏览器的cookie中。ASP.NET Core使用一个特定的cookie名为.AspNetCore.Session来存储一个唯一的Session ID。这个Session ID是一个指向服务器上存储的Session数据的引用。
当用户与应用程序交互时,每次HTTP请求都会通过这个cookie将Session ID发送到服务器。服务器会使用这个Session ID来查找相应的Session数据,在处理请求时可以使用这些数据。用户的Session信息被保存在服务端,可能是在内存中、在一个分布式缓存中,或者其他储存介质中。
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置Session超时时间
options.Cookie.HttpOnly = true; // 安全性设置,防止客户端脚本访问cookie
options.Cookie.IsEssential = true; // 在符合GDPR的应用中,标记为必要cookie
});
3.配置redis
这边也可以使用服务器内存存储:
builder.Services.AddDistributedMemoryCache();
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379"; // Redis服务器连接字符串
options.InstanceName = "SampleInstance"; // 实例名,用于区分不同应用程序的键
});
4.使用session
pp.UseSession();//放MapControllerRoute的前面,顺序不一致,会出现问题
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
5.编写controller的代码
public IActionResult Index()
{
// 设置Session键值
HttpContext.Session.SetString("UserName", "johnDoe");
HttpContext.Session.SetString("Usersex", "man");
return View();
}
public IActionResult DisplayUserName()
{
// 获取Session值
var userName = HttpContext.Session.GetString("UserName");
var Usersex = HttpContext.Session.GetString("Usersex");
return Content($"User Name: {userName},Usersex:{Usersex}");
}
6.运行 在浏览器输入默认的地址 http://localhost:5200/Home/Index
ip和端口改为你们自己的
右击检查,可以看到cookie已经写到了浏览器了
查看redis,也写入了
7.输入 /Home/DisplayUserName
也读取到了redis中的值了