不同的会话如何避免产生重复的Session("Key")内容?

ynduanlian 2013-03-05 08:27:30
在程序中想实现这样的功能:当用户访问某个页后时开始获得一个Key值,来标识本次会话,Key值由访问此页面时的时间的“年月日小时分秒”取得,如20130305200514,这个Key值将用来在数据库中标识记录用户访问此页面后一系列动作。但是不同的用户可能在同一秒钟加载此页面,由此得到相同的Key,在此情况下,则需要另外生成Key值以避免重复。由于取得Key值后并不立即写入数据库进行存储。那么,如何知道某个Key值是否已被别的会话所用了呢?
...全文
491 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaofan_sap 2013-03-06
  • 打赏
  • 举报
回复
首先 完善 一下 9楼的方案:

public class Utility
{
    private state Hashtable  sessionContainers=new Hashtable();
    private static  readonly lockObj=new object();
    public static long  GetGuid()
    { 
        var sessionKey=(long)(DateTime.Now - time).TotalMilliseconds;        
        if(!HasSessionExist(sessionKey.ToString())
        {
         lock(lockObj)
        {
          if(!HasSessionExist(sessionKey.ToString())
          { 
            sessionContainers.Add(sessionKey.ToString(),sessionKey)
            return sessionKey;
            }
           }
         }
        return   sessionContainers[sessionKey];
    }

    private  bool  HasSessionExist(string seesionKey)
    {
       return  sessionContainers.ContainsKey(sessionKey);
     }
}
其中 你的key也可能不是你想要的 ,换成你自己的 就可以 ,思路是上面这样的。代码 手敲写的 ,自己调调。
追梦人1120 2013-03-06
  • 打赏
  • 举报
回复
Guid 是很好的方式,时间戳不会重复的
yyl8781697 2013-03-06
  • 打赏
  • 举报
回复
按照LZ的描述 LZ所说的用户 应该是登录之后的用户吧?? 如果是这样的话,那么应该登录名每个都是不同的 那么就可以用 "login_time"+username/userid 的键值在存储session了 然后的键值因为很有唯一性 也很容易读取
本拉灯 2013-03-05
  • 打赏
  • 举报
回复


public class Utility
{
	private static lockObj=new object();
	public static long  GetGuid()
    { 
		lock(lockObj)
		{
          return (long)(DateTime.Now - time).TotalMilliseconds;
		}
    }
}
这个绝对不会重复了。
gxingmin 2013-03-05
  • 打赏
  • 举报
回复
引用 5 楼 ynduanlian 的回复:
引用 2 楼 gxingmin 的回复:年月日时分+秒用户ID 或直接用guid 因为这个ID需要提供给用户作为查询条件所用,所以考虑后觉得GUID不便于记忆。 而允许时以一个用户名多终端登录,所以加上用户ID也可能重复。
同一个人,同一时间在不同机器上登陆?
ynduanlian 2013-03-05
  • 打赏
  • 举报
回复
年月日时分+秒+浏览器IP应当可以避免,但是那样又太长了,能不能把IP变成某个数字?
devmiao 2013-03-05
  • 打赏
  • 举报
回复
加上一个本线程id,再加key,就不会重复了。
ynduanlian 2013-03-05
  • 打赏
  • 举报
回复 1
引用 2 楼 gxingmin 的回复:
年月日时分+秒用户ID 或直接用guid
因为这个ID需要提供给用户作为查询条件所用,所以考虑后觉得GUID不便于记忆。 而允许时以一个用户名多终端登录,所以加上用户ID也可能重复。
  • 打赏
  • 举报
回复
直接记录mac
  • 打赏
  • 举报
回复
你使用 DataTime.Tick 或者 Guid 之类的就行了。 不要一味地自己重新发明车轮子。
gxingmin 2013-03-05
  • 打赏
  • 举报
回复
年月日时分+秒用户ID 或直接用guid
rayyu1989 2013-03-05
  • 打赏
  • 举报
回复
Cache

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧