.net MVC 解决session超时失效的问题

本文介绍了在ASP.NET MVC框架中遇到Session超时问题的解决方法。默认Session超时为20分钟,通过修改Web.config配置可以将其设置为60分钟。然而,若配置更改未生效,可能是因为应用程序池的闲置超时设置不当。需进入应用程序池的高级设置,将进程模型的闲置超时设为60分钟,以确保Session有效期正确设置。为了测试Session的有效时间,可以通过记录用户访问时间并结合JavaScript刷新页面来观察何时Session失效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用于登录以后,将用户信息写入session

public class HomeController:Controller{
    public ActionResult Login(){
        ....
        System.Web.HttpContext.Current.Session["id"] = RequestHandler.SafeInt(row["id"].ToString());
        System.Web.HttpContext.Current.Session["type"] = RequestHandler.SafeInt(row["type"].ToString());
        System.Web.HttpContext.Current.Session["name"] = row["name"].ToString();
        ....
    }
} 

在UserBaseController的OnActionExecuting方法中验证用户的身份信息

public class UserBaseController : Controller{
    protected override void OnActionExecuting(ActionExecutingContext filterContext){
        base.OnActionExecuting(filterContext);
            if (System.Web.HttpContext.Current.Session["id"] == null)
            {
                if (Request.IsAjaxRequest() == true)
                {
                    filterContext.Result = AjaxForbidden();
                }
                else
                {
                    filterContext.Result = Redirect("/Home/Index");
                }
                return;
            }
    }
}

然后用户的controller都继承自UserBaseController,既可以实现权限的检查。

在.NET MVC中session的默认有效期是20分钟,也就是说用户在某个页面停留超过20分钟之后,再进行其他操作时就不能通过权限检查,因为对应的session[“id”]已经为null。

调整的方式是在项目的Web.config中进行配置,如下方式可以调整为60分钟。

 <system.web>
    <sessionState mode="InProc" timeout="60" />
  </system.web>

但是配置完成之后,并没有生效,session的有效期依然是20分钟。

经过各种谷歌百度查询之后,发现应该是应用程序池中的闲置超时没有进行设置。
在网站对应的应用程序,高级设置,进程模型,闲置超时(分钟)中也设置为60即可,亲测可用。

session有效时间的具体测试方式如下:
1. 用户访问登录的页面时,记录访问时间。
2. 用户访问登录之后的表单操作页面时,记录访问时间。
3. 在表单操作页面,通过javascript操作cookie实现递增时间刷新。
4. 通过日志中的时间间隔就可以分析出,是在时间间隔为多少时,刷新页面之后,跳转到了登录页面(session失效)。

 <script>
 //javascript操作cookie实现递增时间刷新。
 //用到了amazeui操作cookie的api
        if ($.AMUI.utils.cookie.get("sessionTest") != null) {
            var minutes = parseInt($.AMUI.utils.cookie.get("sessionTest"));
        } else {
            var minutes = 1;
        }
        setTimeout(function () {
            window.location.reload();
        }, 60000 * minutes);
        minutes ++;
        $.AMUI.utils.cookie.set("sessionTest",minutes, 60, '/');
    </script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值