不同的会话如何避免产生重复的Session("Key")内容?
在程序中想实现这样的功能:当用户访问某个页后时开始获得一个Key值,来标识本次会话,Key值由访问此页面时的时间的“年月日小时分秒”取得,如20130305200514,这个Key值将用来在数据库中标识记录用户访问此页面后一系列动作。但是不同的用户可能在同一秒钟加载此页面,由此得到相同的Key,在此情况下,则需要另外生成Key值以避免重复。由于取得Key值后并不立即写入数据库进行存储。那么,如何知道某个Key值是否已被别的会话所用了呢? --------------------编程问答-------------------- Cache --------------------编程问答-------------------- 年月日时分+秒用户ID或直接用guid --------------------编程问答-------------------- 你使用 DataTime.Tick 或者 Guid 之类的就行了。
不要一味地自己重新发明车轮子。 --------------------编程问答-------------------- 直接记录mac --------------------编程问答--------------------
因为这个ID需要提供给用户作为查询条件所用,所以考虑后觉得GUID不便于记忆。
而允许时以一个用户名多终端登录,所以加上用户ID也可能重复。 --------------------编程问答-------------------- 加上一个本线程id,再加key,就不会重复了。 --------------------编程问答-------------------- 年月日时分+秒+浏览器IP应当可以避免,但是那样又太长了,能不能把IP变成某个数字? --------------------编程问答--------------------
同一个人,同一时间在不同机器上登陆? --------------------编程问答--------------------
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