.NET Core MVC会话超时重定向及SessionTimeout特性实现方法问询
实现.NET Core中会话超时自动重定向的[SessionTimeout]自定义特性
刚接触.NET Core就能想到用自定义特性来简化重复的会话检查逻辑,这个思路太赞了!下面我一步步带你实现这个[SessionTimeout]特性,让你不用在每个Action里写重复代码,自动处理会话超时后的重定向:
第一步:创建自定义Action过滤器特性
咱们要做的是一个Action过滤器特性,它会在Action执行前自动检查会话状态。新建一个类,比如SessionTimeoutAttribute,继承自ActionFilterAttribute,并重写OnActionExecuting方法:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class SessionTimeoutAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { // 检查会话是否超时:这里假设你用Session["UserId"]存储登录用户标识 // 你可以换成自己项目中用来标记登录状态的Session键 if (context.HttpContext.Session.GetString("UserId") == null) { // 会话超时,重定向到登录页 // 如果需要登录后跳回原页面,可以把当前URL存入TempData context.HttpContext.TempData["ReturnUrl"] = context.HttpContext.Request.Path; context.Result = new RedirectToActionResult("Login", "Account", null); } base.OnActionExecuting(context); } }
第二步:确保你的项目已启用Session
如果还没配置Session,得先在Program.cs里启用它,不然Session功能没法用:
var builder = WebApplication.CreateBuilder(args); // 添加Session服务,设置超时时间(比如20分钟) builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(20); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 添加MVC服务 builder.Services.AddControllersWithViews(); var app = builder.Build(); // 启用Session中间件(注意要放在UseRouting之后,UseAuthorization之前) app.UseSession(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
第三步:在你的Action上标记特性
现在回到你原来的Index Action,只需要加上[SessionTimeout]特性,就能自动触发会话检查了:
[SessionTimeout] // 加上这个特性就搞定啦! public async Task<IActionResult> Index() { var product = await productRepository.GetAll(); ViewBag.Title = "List Of Products"; return View(product); }
额外优化:登录后跳回原页面
如果想让用户登录后自动回到之前访问的页面,可以在登录Action里读取TempData["ReturnUrl"]:
[HttpPost] public async Task<IActionResult> Login(LoginViewModel model) { // 验证登录逻辑... if (ModelState.IsValid) { // 登录成功,设置Session HttpContext.Session.SetString("UserId", model.UserId); // 跳回原页面,没有的话就跳首页 var returnUrl = TempData["ReturnUrl"] as string; return Redirect(returnUrl ?? "/"); } return View(model); }
这样就完美实现了你想要的功能:不用在每个Action里写会话检查代码,只需要加个特性,就能自动在会话超时后重定向到登录页啦!
内容的提问来源于stack exchange,提问作者Millenial2020
相关产品推荐
相关产品推荐

