当前位置:编程学习 > C#/ASP.NET >>

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

在程序中想实现这样的功能:当用户访问某个页后时开始获得一个Key值,来标识本次会话,Key值由访问此页面时的时间的“年月日小时分秒”取得,如20130305200514,这个Key值将用来在数据库中标识记录用户访问此页面后一系列动作。但是不同的用户可能在同一秒钟加载此页面,由此得到相同的Key,在此情况下,则需要另外生成Key值以避免重复。由于取得Key值后并不立即写入数据库进行存储。那么,如何知道某个Key值是否已被别的会话所用了呢? --------------------编程问答-------------------- Cache --------------------编程问答-------------------- 年月日时分+秒用户ID
或直接用guid --------------------编程问答-------------------- 你使用 DataTime.Tick 或者 Guid 之类的就行了。

不要一味地自己重新发明车轮子。 --------------------编程问答-------------------- 直接记录mac --------------------编程问答--------------------
引用 2 楼 gxingmin 的回复:
年月日时分+秒用户ID
或直接用guid

因为这个ID需要提供给用户作为查询条件所用,所以考虑后觉得GUID不便于记忆。

而允许时以一个用户名多终端登录,所以加上用户ID也可能重复。 --------------------编程问答-------------------- 加上一个本线程id,再加key,就不会重复了。 --------------------编程问答-------------------- 年月日时分+秒+浏览器IP应当可以避免,但是那样又太长了,能不能把IP变成某个数字? --------------------编程问答--------------------
引用 5 楼 ynduanlian 的回复:
引用 2 楼 gxingmin 的回复:年月日时分+秒用户ID
或直接用guid
因为这个ID需要提供给用户作为查询条件所用,所以考虑后觉得GUID不便于记忆。

而允许时以一个用户名多终端登录,所以加上用户ID也可能重复。


同一个人,同一时间在不同机器上登陆? --------------------编程问答--------------------


public class Utility
{
private static lockObj=new object();
public static long  GetGuid()
    { 
lock(lockObj)
{
          return (long)(DateTime.Now - time).TotalMilliseconds;
}
    }
}


这个绝对不会重复了。 --------------------编程问答-------------------- 首先 完善 一下 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也可能不是你想要的 ,换成你自己的 就可以 ,思路是上面这样的。代码 手敲写的 ,自己调调。 --------------------编程问答-------------------- 按照LZ的描述  LZ所说的用户 应该是登录之后的用户吧??
如果是这样的话,那么应该登录名每个都是不同的
那么就可以用
"login_time"+username/userid
的键值在存储session了
然后的键值因为很有唯一性  也很容易读取  --------------------编程问答-------------------- Guid 是很好的方式,时间戳不会重复的
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,