码迷,mamicode.com
首页 > Web开发 > 详细

.NET实现单个或几个Session过期时间设置简单方案

时间:2018-02-05 12:32:04      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:.com   返回   结构   覆盖   div   turn   计算   基础   解决   

  .NET下Session使用很简单,对写入Session值无类型限制,设置Session有效时间也很简单,直接设置Session的timeout属性即可,类型为int,单位为分钟。

1             Session["time"] = DateTime.Now.ToString("yyyymmddHHMMss");
2             Session.Timeout = 60;

但若要设置多个有效时间不同的Session,就不那么友好了。后设置的有效时间会覆盖之前值

1             //写入用户登录状态到Session。
2             Session["state"] = "On";
3             //设置用户登录状态有效时间为1天,除非登录清空Session,否则整天登录状态有效。
4             Session.Timeout = 60 * 24;
5 
6             //设置类似验证码类似的session,假设有效时间为1分钟。
7             Session["time"] = DateTime.Now.ToString("yyyymmddHHMMss");
8             Session.Timeout = 1;

如上,设置了两个Session,两个Session有效时间不同,后写入Session有效时间一定会覆盖前面写入Session有效时间。

简易解决思路

  构建结构为:

   1 Tuple.Create<string, object, int>(key, value, time) 

的tuple元组,将tuple写入Session中。(按照顺序依次代表session名、写入值、有效时间)

1         private void SetSingleSession(string key , object value, int? timeout)
2         {
3             int time = timeout ?? Session.Timeout;
4             var tuple = Tuple.Create<string, object, int>(key, value, time);
5             Session[key] = tuple;
6         }

 

  但这样设置存在一个问题,的确写入值到Session,但并没有实现Session的功能。

也就是说,这个Session有效时间并不会到达有效时间后就失效!!!这很关键,怎么办呢?有个关键点必须注意到,一定不能修改Session的timeout参数。

  在此考虑的替代方案是:写入时根据传入有效时间计算出过期时间,将过期时间存入,获取Session时判断是否已经超过过期截止时间,超过返回空,并且清空Session。

重写SetSingleSession方法

1         private void SetSingleSession(string key, object value, int? timeout)
2         {
3             int time = timeout ?? Session.Timeout;
4             DateTime endTime = DateTime.Now + new TimeSpan(0,time,0);
5             var tuple = Tuple.Create(key, value, endTime);
6             Session[key] = tuple;
7         }

获取Session方法

1         private object GetSingleSession(string key)
2         {
3             var tuple = Session[key] as Tuple<string, object, DateTime>;
4             var diff = DateTime.Compare(tuple.Item3, DateTime.Now);
5             object result = null;
6             if (diff > 0) result = tuple.Item2;//有效时间截止之前正常返回值
7             else Session.Remove(key);//超过有效时间清空Session
8             return result;
9         }

  只是一个基础的方案,后续有更好的方案再更新。

.NET实现单个或几个Session过期时间设置简单方案

标签:.com   返回   结构   覆盖   div   turn   计算   基础   解决   

原文地址:https://www.cnblogs.com/fuxuyang/p/8416578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!